0

我有一条路线:

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

它工作正常,但它导致我的系统必须为子路由的所有路由包含默认控制器(索引)。例如,如果我的页面 URI 是/blog/post(其中 blog 是目录,而 post 是操作),我的实际 URI 必须是blog/index/post- 我希望能够退回到仅使用blog/post

所以,我希望它被路由到:

directory = blog
controller = index
action = post

显然,当第二个参数实际上是控制器时,这会导致问题。例如directory/controller/action会被错误地路由。

有没有路由方法检测三个字参数,后面可能跟一个数字参数,可以做我需要的吗?

澄清:

  • 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 个这样的特定用例。

编辑:

“kohana 的路由系统”令人生畏;无法理解他们试图在那里生下的大象......这里有一些其他建议:

  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

As explained on this answer, if you have some route like this:

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

You should have the directory structure like this:

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