【问题标题】:Cakephp routing with optional params带有可选参数的 Cakephp 路由
【发布时间】:2011-01-09 20:30:50
【问题描述】:

我的用户控制器中有一个类似的方法:

function members($type = null, $category = null) { ... }

这两个参数都是可选的,可以一起使用,也可以单独使用。

所以用下面的路线。

Router::connect('/members/*', array('controller' => 'users', 'action' => 'members'));

http://example.com/users/members成功变成http://example.com/members

不幸的是,以下不起作用

http://example.com/members/type:cat
http://example.com/members/category:dog
http://example.com/members/type:cat/category:dog

我怎样才能设置我的路线以使它们都能正常工作?

【问题讨论】:

    标签: php cakephp routing


    【解决方案1】:

    命名参数不会自动映射到动作。您可以通过调用来获取它们

    $this->passedArgs['type'] 或 $this->passedArgs['category']

    或者通过使用 Router::connect: 中的第三个参数:

    Router::connect(
        '/members/*',
        array('controller' => 'users', 'action' => 'members'),
        array(
            'pass' => array('type', 'category')
        )
    );
    

    http://book.cakephp.org/view/46/Routes-Configuration

    【讨论】:

    • 奇怪的是,这在直接输入 url 时确实有效,尽管反向路由不起作用。 $html->link('我的链接', array('controller' => users, 'action' => 'members', 'type' => 'hello', 'category' => 'world'));结果是常规样式的 url。在反向路由工作之前您还需要做些什么吗?
    • 还有其他路由设置吗?如果是这样,则有可能另一个连接调用负责反向路由..
    • Router::connectNamed(array('type', 'category'));似乎有效。
    • 如果控制器和视图位于外部 routes.php 的其他文件夹中,我们可以容纳目录名称吗?
    【解决方案2】:

    试试

    Router::connect('/members/type\:(.*)', array('controller' => 'users', 'action' => 'members_type'));
    Router::connect('/members/category\:(.*)', array('controller' => 'users', 'action' => 'members_category'));
    Router::connect('/members/type\:(.*)/category:(.*)', array('controller' => 'users', 'action' => 'members_type'));
    

    请注意,我没有测试它,但我认为您必须将冒号转义。

    【讨论】:

      猜你喜欢
      • 2016-10-12
      • 2023-03-03
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      • 2018-04-22
      • 2013-10-13
      • 2016-08-01
      相关资源
      最近更新 更多