*
ルートには演算子を使用できます。
ルートにサブカテゴリが 1 つしかないことがわかっている場合、ルートは次のようになります。
Router::connect('/:category/*',
array('controller' => 'categories', 'action' => 'view'))
それは一致mysite.com/about/me
し、このようなアクションに渡します
CategoriesController->view('me')
me
パラメータとして渡され、そのアクション内ですべてのクエリなどを実行できます。
ただし、カテゴリのネストの長さが定義できない場合は、アプローチが異なります。のような URL もマッピングしたいとしますmysite.com/about/me/2012/march
。次に、ルート ルールは次のようになります。
Router::connect('/:category/**',
array('controller' => 'categories', 'action' => 'view'))
そのダブル**
は、ドキュメントでは次のように呼ばれています
末尾に二重スターを使用すると、URL の残りの部分が単一の渡された引数として取り込まれます。これは、/ を含む引数を使用する場合に便利です。
そのため、カテゴリの後のすべてがパラメーターとして渡されます。この例では、呼び出します
CategoriesController->view('me/2012/march')
そのアクションでは、パラメーターの解析を実行して、必要なネストを取得する必要があります。コントローラーで保護された関数またはプライベート関数としてその関数を抽出することをお勧めします
class Categories as AppController {
public function view($url_params) {
//it could be a string or an array or etc, depends on how you want to handle it
$array = $this->_parseCategories($url_params);
}
protected function _parseCategories($stringUrl) {
$subcategories = explode('/', $stringUrl);
//add whatever else you want to do
return $subcategories;
}
}
必要に応じてルートを調整し ( の受け渡しは含めませんでした:category
)、コントローラーも少し変更する必要がありますが、十分にスケーラブルである必要があります。