CakePHP Routing - [home]/slug as URL
问题描述:
我试图去掌握Cake的路由,但我没有找到解决方案来解决我的特定问题。CakePHP Routing - [home]/slug as URL
我想将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在运行中生成路线。
答
您想要小心地将某些东西映射到域名后的第一个路径。这意味着你将打破控制器/动作/参数/参数范例。你可以这样做,但这可能意味着你需要在你的路由文件中为你的站点定义每个url,而不是使用Cake的路由魔术。
另一种可能是使用/ v /为场地和/ e /为事件保持你的网址短,但打破了正常范式的网址。
如果你仍然想要做你在这里所要求的,你可以做如下的事情。它限制了字母,数字,破折号和下划线。
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.
}
}
答
首先,您没有将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
URL的问题在于它是一条无所不包的路由。您需要在此之前仔细定义您可能想要使用的所有其他路线。
的人需要有一个[自定义路由类](http://mark-story.com/posts/view/using-custom-route-classes-in-cakephp) – Dunhamzzz 2011-06-02 12:32:56
@Dunham现在是吗?做什么的? – deceze 2011-06-02 13:09:44
正如您所说,现在正在捕捉所有路线。 – Dunhamzzz 2011-06-02 13:16:26