【问题标题】:Cakephp multi level routingCakephp 多级路由
【发布时间】:2014-01-22 16:50:46
【问题描述】:

我们有一些网站example.com,我想为不同的城市制作路线(例如。 example.com/city1, example.com/city2)。

我们还想显示当前城市的所有其他控制器和方法(例如。 example.com/city1/:controller/:action, example.com/city2/:controller/:action)。

这看起来像 2 个或更多不同的站点,它们在控制器中使用相同的方法,但会根据城市显示不同的信息。

路由器前缀对我们不起作用,因为可能有超过 10 个城市,它必须在控制器中使用相同的方法。

我们可以从管理面板添加城市。

我们如何制作从数据库中获取城市并正确显示所有链接的路线?

【问题讨论】:

  • 请显示您已经尝试过的代码以及您遇到的问题。
  • @Simon 我试过这个: $options = array('city' => 'phoenix|columbus|detroit'); Router::connect('/:city/:controller/:action/*', array(), $options); Router::connect('/:city', array('controller' => 'someControllerName', 'action' => 'index'), $options);并将参数 :city 添加到其他自定义路线,但我想找到更好的解决方案。

标签: cakephp routes


【解决方案1】:
Router::connect('/:city/:controller/:action/*', array());
Router::connect('/:city/:controller/*', array());

这将为您的路由添加一个前缀,但您的所有 URL 都会受到影响。可能还有更简单的方法。

您需要拥有 example.com/New-York/users/login,而不是 example.com/users/login。

如果您想生成所有这些链接,请告诉我们您拥有什么样的控制器和方法。

我粘贴的路线适用于任何前缀(城市名称)

【讨论】:

  • 谢谢,我做了类似的东西。但不确定这是否是最佳解决方案。
【解决方案2】:

我建议你稍微改变一下你的 url 方案,使用 example.com/cities/city1 而不是 example.com/city1。此更改不仅使路由/重写更容易,而且还排除了您添加城市的可能性,该城市会不小心与控制器同名!

(当然会有一些方法来保留你原来的命名方案,但它会更难实现并且有与控制器名称冲突的风险)

一旦你有了 /cities 部分,你就可以做这样的事情(示例代码取自 CakePHP Routing 并且未经测试,只是为了给你一个想法):

// routes.php
Router::connect(
    '/cities/:city/:controller/:action/:id',
    array(),
    array(
        // order matters since this will simply map ":id" to
        // $articleId in your action
        'pass' => array('id', 'city'),
        'id' => '[0-9]+'
    )
);

在您的控制器中:

public function view($articleId = null, $city = null) {
    // some code here...
}

【讨论】:

  • 感谢您的回答,但我只需要我在问题中提到的那些没有城市一词的路线。
猜你喜欢
  • 2011-09-02
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多