0

私は次のようなルートを持っています:

((?<directory>\w+)/?)?((?<controller>\w+)/?)?((?<action>\w+)/?)?((?<id>\d+))?

正常に動作しますが、サブルートへのすべてのルートにデフォルトのコントローラー(インデックス)を含める必要があります。たとえば、私のページのURIが/blog/post(ブログがディレクトリで投稿がアクションになる)の場合、実際のURIは次のようになります-代わりblog/index/postに使用するだけにフォールバックできるようにしたいと思います。blog/post

だから、私はそれを次の場所にルーティングしたいと思います:

directory = blog
controller = index
action = post

明らかに、これは2番目のパラメーターが実際にコントローラーである場合に問題を引き起こします。たとえば、directory/controller/action正しくルーティングされません。

3つの単語パラメーターがあり、その後に数値パラメーターが続くことを検出するルーティング方法はありますか?これにより、必要な処理を実行できますか?

明確化のために:

  • param/param/param(?/id)だろう:directory/controller/action(/id)
  • param/param(?/id)だろう:directory/default_controller/action(/id)
4

2 に答える 2

3

私は実際にあなたがエイリアスblog/index/postしたいと思うでしょうblog/post; あなたが持っている「キャッチオール」ルートの前にルートとして挿入します。「1 つの大きな靴がすべてに適合する」というアプローチが常に最善とは限りません。特に、そのような特定のユースケースが 1 つしかない場合。

編集:

「コハナのルーティング システム」は気が遠くなるようなものです。彼らがそこで出産しようとしている象を理解することはできません...ここにいくつかの他の提案があります:

  1. この問題をメーカーに持ち込んでください。これは間違いなくよくある質問です
  2. 正規表現パターンをいじります。役に立つかもしれないスニペットを次に示します (PHP テスト ケースに入れましたが、簡単に切り離すことができます)。

    public function testRoutePatterns(){
        $data = array(
        array(
            //most specific: word/word/word/id
            '~^(?P<directory>\w+)/(?P<controller>\w+)/(?P<action>\w+)/(?P<id>.*)$~i', 
            'myModule/blog/post/some-id',
            array('directory'=>'myModule', 'controller'=>'blog', 'action'=>'post', 'id'=>'some-id'), 
            true
        ),
        array(
            //less specific: word/word/id
            '~^(?P<directory>\w+)/(?P<action>\w+)/(?P<id>.*)$~i', 
            'blog/post/some-id',
            array('directory'=>'blog', 'action'=>'post'), //need to inject "index" controller via "defaults()" here i guess
            true
        ),
        );
    foreach ($data as $d) {
        $matches = array();
        list($pattern, $subject, $expected, $bool) = $d;
        $actual = (bool) preg_match($pattern, $subject, $matches);
        $this->assertEquals($bool, $actual); //assert matching
        $this->assertEquals(array(), array_diff($expected, $matches)); //$expected contained in $matches
     }
    }
    
于 2012-04-04T10:42:07.183 に答える
0

この回答で説明したように、次のようなルートがある場合:

Route::set('route_name', 'directory/controller/action')
    ->defaults(array(
        'directory'  => 'biz',
        'controller' => 'foo',
        'action'     => 'bar',
    ));

次のようなディレクトリ構造が必要です。

/application/classes/controller/biz/foo.php
于 2012-04-04T12:28:42.500 に答える