アドミンルーティングのひみつ

元記事はこちら

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でのカスタムのプリフィクスルーティングはシンプルで柔軟性の高いものになります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です