1

まず、コハナのドキュメントはひどいです。人々が「ドキュメントを読む」前に、ドキュメントを読んだことがありますが、あまり意味がないようです。コードの一部をコピーして貼り付けても、ドキュメントの一部では機能しません。

それを念頭に置いて、私は次のようなルートを持っています:

//(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 の後に何もない場合は一致します。

4

1 に答える 1

1

次のようにルートを設定します。

Route::set('profile', '<userid>(/<action>)(/)', array(
    "userid" => "[a-zA-Z0-9_]+",
    "action" => "[a-zA-Z]+"
))->defaults(array(
    'controller' => 'profile',
    'action' => 'index'
))

そして、コントローラの before() メソッドで:

if(!in_array($this->request->_action, array('photos', 'blog', 'index')){
    $this->request->_action = 'view';
}

または、同様の方法で、コントローラーでアクションを検証するだけです...

編集:

これも機能します:

if(!is_callable(array($this, 'action_' . $this->request->_action))){
    $this->request->_action = 'view';
}
于 2012-05-13T11:52:16.540 に答える