まず、コハナのドキュメントはひどいです。人々が「ドキュメントを読む」前に、ドキュメントを読んだことがありますが、あまり意味がないようです。コードの一部をコピーして貼り付けても、ドキュメントの一部では機能しません。
それを念頭に置いて、私は次のようなルートを持っています:
//(enables the user to view the profile / photos / blog, default is profile)
Route::set('profile', '<userid>(/<action>)(/)', array( // (/) for trailing slash
"userid" => "[a-zA-Z0-9_]+",
"action" => "(photos|blog)"
))->defaults(array(
'controller' => 'profile',
'action' => 'view'
))
これによりhttp://example.com/username
、ユーザー プロファイルに移動http://example.com/username/photos
したり、ユーザーの写真http://example.com/username/blog
を表示したり、ブログを表示したりできます。
誰かが行った場合、指定されたユーザーhttp://example.com/username/something_else
のアクションをデフォルトにしたいのですが、これを行う方法が見つからないようです。view
<userid>
私はこのようにすることができます:
Route::set('profile', '<userid>(/<useraction>)(/)', array(
"userid" => "[a-zA-Z0-9_]+",
"useraction" => "(photos|blog)"
))->defaults(array(
'controller' => 'profile',
'action' => 'index'
))
次に、コントローラーでこれを行います:
public function action_index(){
$method = $this->request->param('useraction');
if ($method && method_exists($this, "action_{$method}")) {
$this->{"action_{$method}"}();
} else if ($method) {
// redirect to remove erroneous method from url
} else {
$this->action_view(); // view profile
}
}
(機能的には優れているかもしれません__construct()
が、要点はわかります。)
より良い方法が利用可能であれば(実際にあるはずです)、私はむしろそれをしたくありません
答えは正規表現にあると思いますが、次は機能しません。
$profile_functions = "blog|images";
//(enables the user to view the images / blog)
Route::set('profile', '<id>/<action>(/)', array(
"id" => "[a-zA-Z0-9_]+",
"action" => "($profile_functions)",
))->defaults(array(
'controller' => 'profile'
));
Route::set('profile_2', '<id>(<useraction>)', array(
"id" => "[a-zA-Z0-9_]+",
"useraction" => "(?!({$profile_functions}))",
))->defaults(array(
'controller' => 'profile',
'action' => 'view'
));
ただし、ID の後に何もない場合は一致します。