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)」。変更後 - 上記の編集されたスニペットによるコードでは、ルールはまだ一致を見つけることができません。