我正在努力掌握Cake的路由,但我没有找到解决我的特定问题的运气。
我想将www.example.com/slug映射到www.example.com/venues/view/slug,其中slug是特定地点记录的URL友好名称。
我还想将www.example.com/slug/events映射到www.example.com/events/index/venue:slug。
在阅读关于路由的CakePHP文档后,几次,我不是更明智的。我理解如何为每个场地创建这些路线,但我不确定如何让Cake动态生成路线。
答案 0 :(得分:9)
您要小心将某些内容映射到域名后的第一个路径。这意味着您将破坏controller / action / param / param范例。您可以这样做,但这可能意味着您需要在路径文件中定义站点的每个URL,而不是使用Cake的路由魔法。
替代方案可能是使用/ v /用于场地和/ e /用于事件以保持您的网址短,但打破正常范例的网址。
如果您仍想在此处执行此操作,则可以执行以下操作。它将slug限制为字母,数字,破折号和下划线。
Router::connect(
'/:slug',
array(
'controller' => 'venues',
'action' => 'view'
),
array(
'slug' => '[a-zA-Z0-9_-]+'
)
);
Router::connect(
'/:slug/:events',
array(
'controller' => 'events',
'action' => 'index'
),
array(
'slug' => '[a-zA-Z0-9_-]+'
)
);
在您的控制器中,您将使用以下内容访问slug(以第一条路线为例)。
function view(){
if(isset($this->params['slug'])){
//Do something with your code here.
}
}
答案 1 :(得分:3)
首先,您没有将www.example.com/slug连接到www.example.com/venues/view/slug,而是将/slug
连接到控制器操作。像这样:
Router::connect('/:slug',
array('controller' => 'venues', 'action' => 'view'),
array('pass' => array('slug'));
要生成相应的链接,您可以反向执行相同的操作:
$this->Html->link('Foo',
array('controller' => 'venues', 'action' => 'view', 'slug' => 'bar'))
这应该会产生链接/bar
。
路由/:slug
网址的问题在于它是一个包罗万象的路线。您需要仔细定义在此之前可能要使用的所有其他路线。