Phalconルーティングまとめ(1)ルーティングの定義

「最速」PHPフレームワークPhalconのルーティングについて、基本事項をまとめます(公式ドキュメントの翻訳+αです)。記事執筆時のPhalconのバージョンは1.3.1です。

基本形

<?php
// ルーターオブジェクトを作成
$router = new PhalconMvcRouter();
// ルーティング定義
$router->add(
"/admin/users/my-profile",
array(
"controller" => "users",
"action"     => "profile",
)
);

PhalconMvcRouter::add()でルーティングを定義します。第1引数にURL、第2引数にコントローラーやアクションを定義します。なお、ルーティングの優先順位は、後にadd()したものが優先されます。

ルーティングの動作確認

Phalconがインストールされ有効になっている環境であれば、以下のようなスクリプトでルーティングの動作確認を行えます。

<?php
$router = new PhalconMvcRouter();
$router->add(
"/admin/users/my-profile",
array(
"controller" => "users",
"action"     => "profile",
)
);
// テストしたいURLを指定
$router->handle("/admin/users/my-profile");
// コントローラ名とアクション名を表示
printf("Controller: %s n", $router->getControllerName());
printf("Action    : %s n", $router->getActionName());
// ルーティングオブジェクトの中身全部表示
$route = $router->getMatchedRoute();
var_dump($route);

このスクリプトを実行すると、handle()で指定したURLに対して、ルーターに定義したルートがマッチしたかどうか、マッチした場合はどのコントローラーとアクションが実行されるか、が分かります。

柔軟なルーティング

プレースホルダーを使うことで、柔軟なルートを定義できます。

$router->add(
"/admin/:controller/a/:action/:params",
array(
"controller" => 1,
"action"     => 2,
"params"     => 3,
)
);

このルートが定義されているとき、/admin/users/a/delete/dave/301 にアクセスすると、以下のように解釈されます。

Controller users
Action delete
Parameter dave
Parameter 301

プレースホルダー

PhalconMvcRouterで使用可能なプレースホルダーについてまとめた表が以下になります。

プレースホルダー 正規表現 用途
/:module /([a-zA-Z0-9_-]+) モジュール名
/:controller /([a-zA-Z0-9_-]+) コントローラ名
/:action /([a-zA-Z0-9_]+) アクション名
/:params (/.*)* パラメータ。スラッシュ区切りで複数渡せる。このプレースホルダーはルートの末尾にのみ使用できる。
/:namespace /([a-zA-Z0-9_-]+) 名前空間名
/:int /([0-9]+) 自然数

なお、コントローラー名は大文字化が行われます。この際、_と-は取り除かれます。例えば、some_controller は、 SomeController に変換されます。

名前付きパラメータ

$router->add(
"/news/([0-9]{4})/([0-9]{2})/([0-9]{2})/:params",
array(
"controller" => "posts",
"action"     => "show",
"year"       => 1, // ([0-9]{4})
"month"      => 2, // ([0-9]{2})
"day"        => 3, // ([0-9]{2})
"params"     => 4, // :params
)
);

上のようにルーティングを定義すると、下のような形でURLからパラメータを受け取れます。

<?php
class PostsController extends PhalconMvcController
{
public function showAction()
{
$year  = $this->dispatcher->getParam("year");
$month = $this->dispatcher->getParam("month");
$day   = $this->dispatcher->getParam("day");
}
}

以下のような書き方もできます。

$router->add(
"/documentation/{chapter}/{name}.{type:[a-z]+}",
array(
"controller" => "documentation",
"action"     => "show"
)
);
<?php
class DocumentationController extends PhalconMvcController
{
public function showAction()
{
$name = $this->dispatcher->getParam("name");
$type = $this->dispatcher->getParam("type");
}
}

短縮形

PhalconMvcRouter::add()の第2引数には、配列ではなく文字列を渡すこともできます(短縮形)。この場合、コントローラ名とメソッド名を指定します。

// 短縮形
$router->add("/posts/{year:[0-9]+}/{title:[a-z-]+}", "Posts::show");
// 配列
$router->add(
"/posts/([0-9]+)/([a-z-]+)",
array(
"controller" => "posts",
"action"     => "show",
"year"       => 1,
"title"      => 2,
)
);

モジュールへのルーティング

URLにモジュール名が含まれている場合は以下のようなルーティングを行います(複数モジュール構成の場合に使用します)。

$router->add('/:module/:controller/:action/:params', array(
'module' => 1,
'controller' => 2,
'action' => 3,
'params' => 4
));

このルートが定義されている時、/admin/users/edit/sonny にアクセスすると、以下のように解釈されます。

Module admin
Controller users
Action edit
Parameter sonny

モジュール名を明示的に指定することもできます。

$router->add("/login", array(
'module'     => 'backend',
'controller' => 'login',
'action'     => 'index',
));
$router->add("/products/:action", array(
'module'     => 'frontend',
'controller' => 'products',
'action'     => 1,
));

名前空間を指定することもできます。

$router->add("/:namespace/login", array(
'namespace'  => 1,
'controller' => 'login',
'action'     => 'index'
));

名前空間とクラス名の指定もできます。

$router->add("/login", array(
'namespace' => 'BackendControllers',
'controller' => 'login',
'action' => 'index'
));

HTTPメソッドの制限

add()でルートを定義した場合、全てのHTTPメソッドが許可されます。特定のメソッドに限定したい場合は、addGet()/addPost()等を使用します。また、複数のHTTPメソッドを指定する場合は、via()を使用します。

// GETのみ
$router->addGet("/products/edit/{id}", "Products::edit");
// POSTのみ
$router->addPost("/products/save", "Products::save");
// POST又はPUT
$router->add("/products/update")->via(array("POST", "PUT"));

パラメータの加工

$router
->add('/search/{postcode:[a-z-]+}', array(
'controller' => 'search',
'action'     => 'show'
))
->convert('postcode', function($slug) {
// - を取り除く
return str_replace('-', '', $slug);
});

この例では、/search/100-6010 にアクセスすると、searchコントローラーのshowメソッドに、「1006010」というパラメーターが渡されます。

続きは(2)で

今回は、基本的なルーティングの定義方法について紹介しました(公式ドキュメントの、Using convertionsまで)。
次回は、Groups of Routesから先、ルーティングをまとめて管理する方法等をみていきます。

コメントをどうぞ

コメントを残す