2

parseExtensionCakePHP 2 で実行されているアプリにREST などの機能を実装しようとしています。

のような URLhttp://myapp.dev/controller/action.jsonを使用する代わりに、 http://myapp.dev/json/controller/action.

この理由は、拡張機能がhttp://myapp.dev/controller/index/show:10/page:2.json.

:typeこれはカスタム ルートで実装できますが、私は既に多くのカスタム ルートを持っており、メンテナンス上の理由から、それぞれにフィールドを含む複製を作成する必要はありません。

理想的なのは、最初に /json /xml /html などを含む URL が、json、xml、html などが拡張子であるかのように扱われるように設定することです。

プレフィックス ルーティングはこれに最適に見えますが、新しいメソッドが必要です (たとえば、json_index、html_index などで、各形式を個別のプレフィックスとして指定する必要があります)。

これを行う良い方法はありますか?代わりにメソッドparseExtensionsのようになりたいだけです。parsePrefixes

4

1 に答える 1

1

次のことを試してください。

Router::connect('/:ext/', array(':ext'), array('pass' => 'ext'));
Router::connect('/:ext/:controller/*', array(':ext'), array('pass' => 'ext'));
Router::connect('/:ext/:controller/:action/*', array(':ext'), array('pass' => 'ext'));

次に、ルーターは、ルートパラメーターの「ext」値で :ext 引数を渡します。すべてのルールに追加してください。

従来のルートを使用したい場合は、カスタムの CakeRoute を使用する必要があります。app フォルダーに「/libs/routes/RestRoute.php」ファイルを作成し、以下を追加します。

class RestRoutes extends CakeRoute {
    function parse($url) {
        $params = parent::parse($url);

        if (empty($params)) {
            return false;
        }

        if(!in_array($params['ext'], Router::extensions())) {
            return false;
        }

        return $params;
    }
}

そしてあなたの /core/routes.php で:

App::import('Lib', 'routes/RestRoute');
Router::connect('/:ext/', array(':ext'), array('pass' => 'ext', 'routeClass' => 'RestRoute'));
Router::connect('/:ext/:controller/*', array(':ext'), array('pass' => 'ext', 'routeClass' => 'RestRoute'));
Router::connect('/:ext/:controller/:action/*', array(':ext'), array('pass' => 'ext', 'routeClass' => 'RestRoute'));

そのため、カスタム ルートが URL を渡すことができない場合、ext パラメータなしでデフォルトの URL を試します。そうしないと、パラメーターの順序が適切ではありません。

最善またはよりクリーンなソリューションではないかもしれませんが、良いスタートです。

于 2012-07-16T17:05:00.857 に答える