1

URLが次のようになる状況を想像してみてください

/ catalog / sectionIdent?page = 1

ここで、ページパラメータはオプションです。

もちろん、カスタムルートを定義する必要があります。次のコードを検討してください。

    $route = new Zend_Controller_Router_Route_Regex(
        'catalog/([-a-z]+)(?:\?page=([0-9]*))?',
        array('controller'=>'catalog','action'=>'list','page'=>''),
        array(1=>'section',2=>'page'),
        'catalog/%s?page=%d'
    );
    $router->addRoute('catalog-section-page',$route); 

ただし、このルートは「?」でトリガーされません。URLの記号

それなし '?' (たとえば、エスケープされた「!」記号をパターンに追加することにより)すべてが正常に機能します。'?'を達成する方法はありますか?カスタム定義の正規表現ルートに存在しますか?たぶん私はパターンで何か間違ったことをしていますか?

PS:「?」の代わりに「/」を使用することを提案しないでください。質問は、Zend_Controller_Router_Route_Regex実装のパターン制限に関するものです。

4

1 に答える 1

2

ZF ルーティング クラスは、クエリ文字列が取り除かれた REQUEST_URI で動作するため、期待どおりに動作させるのに苦労する場合があります。ただし、GET パラメーターはデフォルトでリクエスト オブジェクトに入れられると思うので、ルートでそれらに対応する必要はありません。ルートを変更して、クエリ文字列の部分を削除することをお勧めします。

$route = new Zend_Controller_Router_Route_Regex(
    'catalog/([-a-z]+)',
    array('controller'=>'catalog','action'=>'list'),
    array(1=>'section'),
    'catalog/%s'
);
$router->addRoute('catalog-section-page',$route); 

ルートによって入力されたかのように、コントローラーのパラメーターにアクセスできるはずです。

public function listAction()
{
    echo $this->_getParam('page');
}

同じ方法を使用してデフォルトを設定できます。

public function listAction()
{
    $page = $this->_getParam('page', 1); // defaults to 1 if no page in URL
}

そこでサニタイズする必要があるかもしれません(数値であることを確認してください)。

編集:

このルートを使用した URL ヘルパーの例:

echo $this->url(array('section' => 'foo', 'page' => 2), 'catalog-section-page') 
于 2011-02-14T15:20:02.487 に答える