元記事はこちら。
By nate
ベルリンでのCakeFestワークショップで頻繁に取り上げられた話題の一つは、ルーティングシステムについてでした。ほとんどの使用パターンについて触れたものの、さほど深くまで取り上げなかったものの中にadminルーティングがあります。驚くことではありませんが、リクエストの一番多い分野です。
CakePHPでは、adminルーティングはとてもシンプルです。ON/OFFで切り替えられますし、プリフィクスを変更できます。しかし、これだけではありません。
ちょっとしたコードで、ちょっとした秘密を明かしましょう。
Configure::write('Routing.admin', 'admin'); |
不適切です。
初期には(バージョン1.1の頃)、adminルーティングは明らかに静的でした。しかし、1.2で見直され、通常のルーティング作成と同様にadminルーティングを作成できるようになりました(現在ではプリフィクスルーティングと呼びます)。設定自体は前のバージョンと互換性を保っていますが、以下に示す書き方でもほとんど同じように機能します。
Router::connect('/admin/:controller/:action/*', array( 'action' => null, 'prefix' => 'admin', 'admin' => true )); |
「ほとんど」というのは、一つにはこのコードではプラグインをカバーしていないからですが、以下のように修正できます。
if ($plugins = Configure::listObjects('plugin')) { $pluginMatch = implode('|', array_map(array('Inflector', 'underscore'), $plugins)); Router::connect( "/admin/:plugin/:controller/:action/*", array('action' => null, 'prefix' => 'admin', 'admin' => true), array('plugin' => $pluginMatch) ); } |
パラメータの説明です。
- ‘prefix’ => ‘admin’ – これはアクションにつけられたプリフィクスを定義する特別なルーティングキーです。このキーを調整すると、リクエストそのものではなく、リクエストの割り当て方を変更するので、リバースルーティングは考慮されません。次のキーを考えましょう。
- ‘admin’ => true – 「prefix」キーはリバースルーティングを考慮しませんので、ルーティングの識別のためにフラグが必要であり、フラグがあればリクエストがこのルーティングを通っているのかを確認できます。規約によりprefixの値と同じものでなければなりませんが、ユーザーが調整可能でない限りこのフラグはなんでもあり得ます。(たとえば、URLテンプレートに無いもの)
- ‘action’ => null – 指定されたアクションへのルーティングを設定します(デフォルトでは通常、indexアクションが実行されます)。
- ‘plugin’ => $pluginMatch – プラグインのルーティングで、有効なプラグイン名と一致するものを指定します。
これらのフラグを使用して、目的にあったプリフィクスをいくつでも自由に作成できます。これらのフラグはデフォルトでは持続しません。しかし、Cakeに特定のパラメータを自動的に保持するように設定することはできます。PaginatorHelperでの例を以下に示します。
$paginator->options(array('url' => array('admin' => true))); echo $paginator->link('Page 2', array('page' => 2)); |
しかし、これはPaginatorHelperが生成したURLのみに適用されます。汎用化して全てのヘルパーに適用するには、AppHelperに以下のような簡単なチェックを実装できます。
App::import('Core', 'Helper'); |
class AppHelper extends Helper { function url($url = null, $full = false) { if (isset($this->params['admin']) && is_array($url) && !isset($url['admin'])) { $url['admin'] = $this->params['admin']; } return parent::url($url, $full); } } |
このコードはアプリケーション全体にわたって持続されるものと思われます。
結論
これらのテクニックを使えば、CakePHPでのカスタムのプリフィクスルーティングはシンプルで柔軟性の高いものになります。