1

名前付きパラメーターを含む URL があり、それをよりユーザー フレンドリな URL にマップしたいと考えています。

たとえば、次の URL を見てください。

/videos/index/sort:published/direction:desc

これを、次のようなよりわかりやすい URL にマップしたいと考えています。

/ビデオ/最近

ルーターで設定しようとしましたが、うまくいきません。

ルーターのコード サンプル:

Router::connect(
    '/videos/recent/*',
    array('controller' => 'videos', 'action' => 'index'),
    array('sort' => 'published', 'direction' => 'desc'
));

これは機能しません。また、以下も機能しません。

Router::connect(
    '/videos/recent/*',
    array('controller' => 'videos', 'action' => 'index', 'sort' => 'published', 'direction' => 'desc'));

何か案は?

4

2 に答える 2

0

get args を使用する

ルートを機能させる最も簡単な方法は、名前付き引数をまとめて回避することです。適切な configを使用して簡単に実現できるページネーション:

class FoosController extends AppController {

    public $components = array(
        'Paginator' => array(
            'paramType' => 'querystring'
        )
    );
}

このようにしてロード/videos/recentすると、次の形式の URL が含まれていることがわかります。

/videos/recent?page=2
/videos/recent?page=3

代わりに (ルートの不一致による)

/videos/index/sort:published/direction:desc/page:2
/videos/index/sort:published/direction:desc/page:3

しかし、本当に名前付き引数を使用したい場合

ルート定義を更新する必要があります - ルート設定にページがありません:

Router::connect(
    '/videos/recent/*',
    array(
        'controller' => 'videos', 
        'action' => 'index', 
        'sort' => 'published', 
        'direction' => 'desc'
     )
);

そのため、パラメーターという名前のページがある場合 (ページネーター ヘルパーによって生成されるすべての URL に存在します)、ルートは一致しません。pageルート定義に追加することで、これを修正できるはずです。

Router::connect(
    '/videos/recent/*',
    array(
        'controller' => 'videos', 
        'action' => 'index', 
        'sort' => 'published', 
        'direction' => 'desc',
        'page' => 1
     )
);

機能していても、壊れやすいと感じるかもしれません。

于 2013-06-27T13:55:31.800 に答える
0

[Router::connect のドキュメント] を参照してください (ルートは、リクエスト URL をアプリケーション内のオブジェクトに接続する方法です)

ルートは、リクエスト URL をアプリケーション内のオブジェクトに接続する方法です

したがって、URL を URL にマップするのではなく、URL をオブジェクトにマップします。

次の 2 つのオプションがあります。

Router::redirect を使用する

そんな感じ:

Router::redirect( '/videos/recent/*', '/videos/index/sort:published/direction:desc');

しかし、それはあなたが正確に望んでいることではないようです

Router::connect を使用する

通常の Router::connect を使用して、適切なスコープを作成するアクションに URL を接続します。そんな感じ:

Router::connect(
    '/videos/recent/*',
    array(
        'controller' => 'videos', 
        'action' => 'recent'
     )
);

および VideosController で

public function recent() {
    $this->request->named['sort'] = 'published';
    $this->request->named['direction'] = 'desc';
    $this->index();
}

それは機能し、そのような使用法を見ましたが、確かではありません。それはあなたも満足させるでしょう.

私としては、通常の名前付きの cakephp パラメータが好きです。そのようなスコープ (published および desc) がデフォルトの状態である場合は、index アクションでデフォルトの状態をコーディングするだけです。以上の場合、通常の名前付きパラメーターを使用するのが普通だと思います。

于 2013-06-27T16:11:17.020 に答える