【问题标题】:CakePHP routing with colon separator带有冒号分隔符的 CakePHP 路由
【发布时间】:2010-08-29 21:53:21
【问题描述】:

我需要创建包含冒号的路由以生成像 http://app.com/prjct:a9b5c 这样的 URL。显然,目前使用斜线代替默认路由很简单。

$SLUG = array('slug' => '[-_A-Za-z0-9]+');
Router::connect('/prjct/:slug', array('controller' => 'projects', 'action' => 'show'), $SLUG);

但是路由规范使用冒号作为特殊指示符,这干扰了我用另一个冒号替换上面第二个斜线的天真尝试。

在这种情况下,如何将冒号用于路由?

【问题讨论】:

    标签: cakephp routing


    【解决方案1】:

    您可以按照CakePHP Cookbook 中的说明使用命名参数。在您的 app/config/routes.php 中编写以下代码:

    // Parse only the 'prjct' parameter if the current action is 'show' and the controller is 'projects'.
    Router::connectNamed(array('prjct' => array('action' => 'show', 'controller' => 'projects')));
    
    // Then set default route to controller 'projects' and action 'show
    Router::connect('/', array('controller' => 'projects', 'action' => 'show'));
    

    在您的 projects_controller.php 中:

    function show(prjct = null) {
        // Check if prjct match the pattern
        $pattern = '[-_A-Za-z0-9]+';
        if(!preg_match($pattern, prjct)){
            // Redirect somewhere else
        }
        // Rest of your code here
    } 
    

    【讨论】:

      【解决方案2】:

      我认为这确实超出了简单路线的范围。我看到两个选项:

      1. 使用自定义路由解析类,如here 所述。关于该主题的文档并不多,但您可以扩展现有的类并使用它来了解它在做什么。然后根据您的需要对其进行自定义。

        class MyRoute extends CakeRoute {
            public function parse($url) {
                debug($url);    // input
                $route = parent::parse($url);
                debug($route);  // output
                return $route;
            }
        }
        
      2. 使用包罗万象的路由将这些 URL 路由到控制器,其中参数将作为 $this->params['named'] 中的命名参数提供。在那里做你需要做的事情。

      【讨论】:

        猜你喜欢
        • 2019-02-22
        • 2011-01-23
        • 1970-01-01
        • 1970-01-01
        • 2012-01-02
        • 2014-08-29
        • 2013-03-10
        • 2011-03-26
        相关资源
        最近更新 更多