0

URL をクリーンアップするための正規表現ルートを定義しています。ユーザーが追加したすべてのページは、実際のコントローラー www.example.com/userpages/page-slug を使用するのではなく、URL www.example.com/page-slug を使用するという考え方です。他のページは、標準の module:controller:action ルーティング スキームに従います。

ルーターの優先順位を使用してこれを実現しようとしています。

以下のスキームを定義しました。

class Default_Bootstrap extends Zend_Application_Module_Bootstrap{  

protected function _initRoute() {

    $front = Zend_Controller_Front::getInstance();
    $router = $front->getRouter(); // returns a rewrite router by default

    $route['index'] = new Zend_Controller_Router_Route_Regex(
        '/',
        array(
        'module'     => 'default',
        'controller' => 'index',
        'action'     => 'index'
        )
    );
    $route['contact'] = new Zend_Controller_Router_Route_Regex(
        'contact/(\d+)',
        array(
        'module'     => 'default',
        'controller' => 'contact',
        'action'     => 'index'
        )
    );
    $route['research'] = new Zend_Controller_Router_Route_Regex(
        'research/(\d+)',
        array(
        'module'     => 'default',
        'controller' => 'research',
        'action'     => 'index'
        )
    );
    $route['account'] = new Zend_Controller_Router_Route_Regex(
        'account/(\d+)',
        array(
        'module'     => 'default',
        'controller' => 'account',
        'action'     => 'index'
        )
    );
    $route['userpages'] = new Zend_Controller_Router_Route_Regex(
        '/(.+)',
        array(
        'module'     => 'default',
        'controller' => 'userpages',
        'action'     => 'index'
        ),
        array(
        'slug' => 1
        ),
        '%s'
    );

    $router->addRoute('userpages',     $route['userpages']);
    $router->addRoute('contact',       $route['contact']);
    $router->addRoute('research',      $route['research']);
    $router->addRoute('account',       $route['account']);
    $router->addRoute('index',         $route['index']);

}

}

インデックス/アカウント/研究/連絡先ページが正しいコントローラーを取得していることを確認するルーターの優先順位で、通常は問題なく動作しています。ただし、「userpages」ルート (「about-us」など) でカバーされる URL に移動しようとすると、最終的なキャッチオールルートが見つからず、...

Message: Invalid controller specified (about-us) 
.
.
.
Request Parameters:

array (
  'controller' => 'about-us',
  'action' => 'index',
  'module' => 'default',
)  

ここでどこが間違っているのか分かりますか? 正規表現は正しい「/(.+)」であるように思えますが、インデックスページではないすべてのものをキャッチする必要があります。

編集: @phatfingers、そのとおりです。「\d+」を「.+」に編集して、1 つ以上の任意の文字をキャッチしました。問題は解決しません。実際、正規表現を変更する前に、URL www.example.com/52 を試してみたところ、同じエラーが発生しました - 「無効なコントローラーが指定されました (52)」。変更後 - 上記の編集されたスニペットによるコードでは、ルールはまだ一致を見つけることができません。

4

1 に答える 1

0

「userpages」正規表現にスラッシュをドロップします。つまり、('.+) だけです。

引用は手動のZend Routerと Router_Regex から直接引用していますが、すべてのルートにも適用されます。

注: 先頭と末尾のスラッシュは、一致する前に Router の URL から削除されます。その結果、URL http://domain.com/foo/bar/との一致には、/foo/bar ではなく foo/bar の正規表現が含まれます。

于 2012-05-13T20:24:51.887 に答える