PhalconのデフォルトのURIのルールを変更したい場合
どうしてもMVCモデルにのっとって、URIを構築していくとMVCモデル感があるのと、どうしてもモデル周りで悩んでしまいます。
同じテーブルを参照するが、URIは少し変えたいときに「ルーティング(routing)」を利用します。しかし、ルーティングに関してはPhalconだけではなく、
他のMVCモデルにもあるごく普通な機能です。なので、よく利用する方法だけ取りまとめます。
詳しいリファレンスはドキュメント ルーティング
Phalcon ルーティングの利用
MVCモードでは、ルートを定義して、それらを好きなコントローラー、アクション、パラメータと結びつけることができます。
Phalconのデフォルトは「/:controller/:action/:params」となります。これは、URIの最初の部分がコントローラー、2番めの部分がアクション、残りがパラメーターになる、ということです。
use Phalcon\Mvc\Router; // ルーターの初期化 $router = new Router(); // ここにルートの定義を書いていきます $router->handle();
ただ、なんでもブートストラップ (public/index.php)に書いていくと大変な事になります。routerはDIにサービス登録して使う事もできます。
/** public/index.php */ /** * Read services */ include __DIR__ . "/../app/config/services.php"; /** * Handle the request */ $application = new \Phalcon\Mvc\Application($di); echo $application->handle()->getContent();
/** app/config/services.php */ /** * ルーティング用のファイルを準備し、読み込みdiにサービス登録します */ $di->set('router', function(){ require __DIR__.'/routes.php'; return $router; });
/** app/config/routes.php */ use Phalcon\Mvc\Router; // ルーターの初期化 $router = new \Phalcon\Mvc\Router(); // ここにルートの定義を書いていきます return $router;
まわりくどいように見えますが、実際にアプリケーションを組み込むとDIへのサービス登録は必要に応じてたくさん出てくるので、ファイルを分けたほうが無難だと思います。
よく使いそうなものをピックアップします。
ルートの定義
add()メソッドは、第1引数にURIのパターン、第2引数にパスをとります。
// ルートの定義 $router->add( "/admin/users/my-profile", array( "controller" => "users", "action" => "profile" ) ); // ルートの定義 $router->add( "/admin/:controller/a/:action/:params", array( "controller" => 1, //:controllerの値 "action" => 2, //:actionの値 "params" => 3 //:paramsの値 ) );
1つ目の定義は、URIが完全に「/admin/users/my-profile」と一致した場合に適用されます。
このとき呼ばれるコントローラは「usersController」であり、アクションが「profileAction」です。
2つ目の定義は定義済みのプレースホルダーを利用したルーティングです。プレースホルダーには特定の正規表現がかけられます。
add()メソッドを使うことで好きなだけルートを追加することができます。後で追加されたルートの方(下の方)が優先して適用されます。
また、下のように自分が適用させたい正規表現を使った定義の仕方もできます。
$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 "type" => "atype" //ルーティングの中で独自にパラメータを追加することもできる ) );
コントローラでのパラメータの取得方法
$name = $this->dispatcher->getParam("name");
これでパラメータ”name”が取得できます。
デフォルトのマッチングを利用したくない
use Phalcon\Mvc\Router; // デフォルトルートなしのルーターを作る $router = new Router(false);
デフォルトルートの設定
$router->add( "/", array( 'controller' => 'index', //変更してもよい 'action' => 'index' //変更してもよい ) );
明示的に書いておくと分かりやすくていいかもしれません。
Not Foundの定義
$router->notFound( array( "controller" => "index", "action" => "show404" ) );
以上である程度のwebアプリケーションに対しては対応できると思います。URIは十分に(エラーケースを含めた)テストを行うといいでしょう。