【问题标题】:CakePHP route with regex带有正则表达式的 CakePHP 路由
【发布时间】:2012-04-30 03:00:59
【问题描述】:

我有一个控制器设置来接受两个变量:/clients/view/var1/var2

我想显示为/var1/var2

我试过了

Router::connect('/*', array('admin'=>false, 'controller' => 'clients', 'action' => 'view'));

但这会阻止所有其他控制器作为/* 路由一切

站点上的所有其他页面都在 admin 前缀内,所以如果当前前缀是 admin,基本上我需要一个被忽略的路由!我试过这个(正则表达式来自Regular expression to match a line that doesn't contain a word?):

Router::connect('/:one', array('admin'=>false, 'controller' => 'clients', 'action' => 'view'), array(
    'one' => '^((?!admin).*)$'
));

但我认为正则表达式不正确,因为如果我导航到 /test,它会要求测试控制器,而不是客户端

我唯一的其他路线是:

Router::connect('/admin', array('admin'=>true, 'controller' => 'clients', 'action' => 'index'));
Router::connect('/', array('admin'=>false, 'controller' => 'users', 'action' => 'login'));

我做错了什么?谢谢。

【问题讨论】:

    标签: php regex cakephp routes


    【解决方案1】:

    我第一次误解了你的问题。我测试了你的代码,也没有得到预期的结果。原因可能是正则表达式解析器不支持负前瞻断言。但我仍然认为您可以通过重新排序路线来解决这个问题:

    CakeBook describes which routes are automatically generated if you use prefix routing。在您的情况下,必须在 '/*' 路由之前手动分配这些路由以捕获所有管理操作。这是对我有用的代码:

    // the previously defined routes
    Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
    Router::connect('/admin', array('controller' => 'clients', 'action' => 'index', 'admin' => true));
    
    // prefix routing default routes with admin prefix
    Router::connect("/admin/:controller", array('action' => 'index', 'prefix' => 'admin', 'admin' => true));
    Router::connect("/admin/:controller/:action/*", array('prefix' => 'admin', 'admin' => true));   
    
    // the 'handle all the rest' route, without regex
    Router::connect(
        '/*', 
        array('admin'=>false, 'controller' => 'clients', 'action' => 'view'), 
        array()
    );
    

    现在我获得了所有带有 admin 前缀的管理控制器操作,并且 /test1/test2 被重定向到客户端控制器。

    【讨论】:

    • 谢谢,这正是我需要的。我了解每条路线的顺序如何影响事物,但不了解:controller/:action/* 位。这种方式只是意味着我必须为每个前缀添加 2 行,这很棒。
    【解决方案2】:

    我认为解决方案在面包店article on routing 中有所描述-“将参数传递给操作”(代码未测试):

    Router::connect(
        '/clients/view/:var1/:var2/*',  
        array( 
            'controller' => 'clients',
            'action' => 'view'
        ),
        array( 
            'pass' => array( 
                'var1', 
                'var2' 
            ) 
        ) 
    );
    

    控制器动作如下所示:

    public function view($var1 = null, $var2 = null) { 
        // do controller stuff
    }
    

    您还必须查看路线的顺序(阅读“路线的顺序很重要”部分)。在您的示例中,如果“/*”首先出现,则它会停止所有其他路由,如果您在其他路由之后分配规则,则它仅处理与任何其他路由不匹配的请求。

    【讨论】:

    • 这似乎是正确的,但是当我转到/test1/test2 时,它只要求app/Controller/Test1Controller.php :(
    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多