5

コントローラーとディレクトリーの名前が以下の例と同じである場合、Kohana 3.3 でルートを正しくセットアップするにはどうすればよいですか?

/application/classes/Controller/Admin/Author.php
 - 管理者/作成者
 - 管理者/作成者/追加
 - 管理者/作成者/編集

/application/classes/Controller/Admin/Author/Book.php
 - 管理者/著者/本
 - 管理者/著者/本/追加
 - 管理者/著者/書籍/編集

次のルートを指定された順序で使用すると、admin/author{/action}にのみアクセスできますが、 admin/author/book{/action}にはアクセスできません。

ルーティングの順序を逆にすると、admin/author/book{/action}にはアクセスできますが、admin/author{/action} にはアクセスできません

Route::set('admin', 'admin(/<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'directory'  => 'admin',
        'controller' => 'Main',
        'action'     => 'index',
    ));

Route::set('admin/author', 'admin/author(/<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'directory'  => 'admin/author',
        'controller' => 'Main',
        'action'     => 'index',
    ));
4

3 に答える 3

3

次のようなものが必要です。

Route::set('admin-author', '<directory>/<controller>(/<action>(/<id>))', array(
        'directory' => '(admin|admin/author)',
        'action'    => '(add|edit|delete|index)'
    ))
    ->defaults(array(
        'directory'  => 'admin',
        'controller' => 'author',
    ));

また、正規表現でアクションを確認することもできます^book(テストされていません)。

もう 1 つの方法は、ルート フィルターを使用することです。

于 2012-11-16T06:59:09.147 に答える
0

admin/author/book も定義する必要があります

Route::set('admin-author-book', 'admin/author(/<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'directory'  => 'admin/author',
        'controller' => 'book',
        'action'     => 'index',
    ));
Route::set('admin-author-book', 'admin/author(/book(/<action>(/<id>)))')
    ->defaults(array(
        'directory'  => 'admin/author',
        'controller' => 'book',
        'action'     => 'index',
   ));
于 2012-11-16T04:21:11.523 に答える
0

ルートに関する最も重要なこと:ルートは追加された順序で照合されます。ルートの順序を逆にすることは正しいですが、問題はルートadmin/authorも一致することadmin/author{/action}です。できること: コントローラーとアクションを必須にする:

// Does not match admin/author/add
Route::set('admin/author', 'admin/author/<controller>/<action>(/<id>)')
    ->defaults(array(
        'directory'  => 'admin/author',
    ));

Route::set('admin', 'admin(/<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'directory'  => 'admin',
        'controller' => 'Main',
        'action'     => 'index',
    ));

いくつかの方法がありますが、別の方法として、コントローラーの「ホワイトリスト」を作成する方法があります。

// Does not match admin/author/add
Route::set('admin/author', 'admin/author/<controller>(/<action>(/<id>))',
    array(
        'controller' => '(book|another-controller)'
    ))
    ->defaults(array(
        'directory'  => 'admin/author',
    ));

Route::set('admin', 'admin(/<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'directory'  => 'admin',
        'controller' => 'Main',
        'action'     => 'index',
    ));
于 2012-11-16T10:48:51.327 に答える