Phalconルーティングまとめ(2)ルーティングを使いこなす

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

なお、ルーティングの定義方法等の基本事項については、(1)を参照してください。

ルートのグループ化

ルートが共通のパスを持っている場合、それらをひとまとめにすることができます。

ルートグループを別ファイルに分けることもできます。

あとは、このグループをルーターにmount()するだけです。

mod_rewrite

ルーターに有効なURLが渡されると、ルーターは与えられたURLがルートにマッチするかチェックします。デフォルトでは、mod_rewriteによって $GET[‘url’] という値が作られるようになっており、この値がルーターに渡されます。Phalconで一般的に使用されるmod_rewrite設定は以下のようになります。

名前付きルート

ルーターに追加されたルートは、PhalconMvcRouterRoute オブジェクトとして保持されます。このクラスは、それぞれのルートの詳細をカプセル化します。したがって、以下のような使い方もできます。

名前付きルートは以下のように利用します(PhalconMvcUrlを使用)。

使用例

以下は、ルーティングのカスタマイズ例です。

コントローラーと名前空間として許可する文字列の正規表現には、注意する必要があります。これらの文字列はファイルを探す際に使われるため、許可しないファイルへのアクセスを許してしまう恐れがあります。安全な正規表現は「 /([a-zA-Z0-9_-]+)」です。

デフォルトルーティング

PhalconMvcRouter にはデフォルトのルーティングが設定されています。そのパターンは、「/:controller/:action/:params」です。

例えば、http://phalconphp.com/documentation/show/about.html というURLは以下のように変換されます。

Controller documentation
Action show
Parameter about.html

このルートを使いたくない場合、ルーターの初期化時にfalseを渡します。

デフォルトルートの設定

アプリケーションがいずれのルートにもマッチしないURLでアクセスされた場合、「/」ルートが使用されます。

デフォルトパスの設定

モジュールや名前空間のデフォルトをあらかじめ設定しておくこともできます。

Not Found設定

いずれのルートにもマッチしなかった場合のルーティングを設定することができます。

余分なスラッシュの扱い

余分なスラッシュを伴ってアクセスされた場合(”/login”に対して”/login/”でアクセス等)、デフォルトではルートはマッチせず、Not Foundになります。余分なスラッシュを無視したい場合は、以下のメソッドを使用します。

あるいは、自前で末尾スラッシュを無視するルートを定義することもできます。

マッチのコールバック関数

beforMatchメソッドにコールバック関数を渡すことで、より複雑な条件によるマッチングを行えます。

マッチング条件のコールバックは、クラスにすることで再利用できるようになります。

この場合、無名関数の代わりにフィルタークラスのインスタンスと、実行したいメソッド名を渡します。

ホストネーム制約

ルートに、ホストネームによる制約を付けることができます。

ホストネーム制約では、正規表現も使えます。

特定のグループに対してホストネーム制約を設定することもできます。

URIの取得方法を変更する

Phalconのデフォルトでは、ルーターに渡されるURLは $GET[‘url’] から取得します。Router::setUriSource()にRouter::URI_SOURCE_SERVER_REQUEST_URI を渡すことで、 $GET[‘url’]からではなく、$_SERVER[‘REQUEST_URI’]からURLを取得するように変更できます。

ルーティングの動作テスト

以下のスクリプトで、ルーティングの動作テストを行えます。

ルーターインスタンスを登録する

DIコンテナにルーターのインスタンスを登録することで、ルーターが利用可能になります。

上記phpファイルの末尾では、ルーターインスタンスをreturnしています。このphpファイルをrequireすると、returnされた値をrequireの返り値として受け取ることができます。

独自のルーターを実装する

PhalconMvcRouterInterfaceを実装したルーターを作れば、自前のルーターを用意することができます。

まとめ

今回は、Testing your routesまでを紹介しました。ここまでで、Phalconのルーターに関しては、ほとんどの事項を学び終えたことになります。

残りは、Symfony風のAnnotations Routerのような若干マニアックな機能であったり、APIリファレンスだったりなので、記事にするかは未定です。

APIリファレンスについては、PhalconMvcRouterPhalconMvcRouteあたりは見ておくと良いと思います。グループ機能を使うなら、PhalconMvcRouteGroupも。

コメントを残す