针对多种post类型的cakephp路由
我使用的是CakePHP2+,我有一个名为“posts”的模型,posts可以是不同的类型,例如blog post、message等 在config/routes.php中,如何设置我的路由,使我拥有针对多种post类型的cakephp路由,php,cakephp,url-rewriting,routing,Php,Cakephp,Url Rewriting,Routing,我使用的是CakePHP2+,我有一个名为“posts”的模型,posts可以是不同的类型,例如blog post、message等 在config/routes.php中,如何设置我的路由,使我拥有/posts/12/post title或/blog/14/blog title 目前,我有以下几点: Router::connect('/:type/add', array('controller' => 'posts', 'action' => 'add'), array('
/posts/12/post title
或/blog/14/blog title
目前,我有以下几点:
Router::connect('/:type/add', array('controller' => 'posts', 'action' => 'add'),
array('pass' => array('type')));
Router::connect('/:type/:action', array('controller' => 'posts'),
array('pass' => array('type')));
# Custom posts router
Router::connect('/:type/:id/:slug',
array('controller' => 'posts', 'action' => 'view'),
array('pass' => array('type', 'id', 'slug'), 'id' => '[0-9]+'));
但问题是,这将用于每个URL,因此cakephp认为我的用户配置文件页面应该查看我的posts控制器,因为它认为我传递的是:type-
有人知道如何正确地做这件事吗?非常感谢首先,路由的顺序很重要,如果多个路由匹配一个URL,那么将处理第一个匹配的路由
接下来,您可以通过在Router::connect()的最后一个参数中为“type”键设置正则表达式来限制“what”将被视为“type”,就像您对“id”所做的那样。您可以在正则表达式中包含所有有效类型,也可以在正则表达式中添加排除值(例如控制器名称)的“负”部分
大概是这样的:
Router::connect(
'/:type/:action',
array(
'controller' => 'posts',
),
array(
/**
* Custom type:
* only allow 'post', 'blog' or 'message' as type here
* to prevent overlapping with 'controllers'
*/
'type' => '(post|blog|message)',
// Define what should be passed to the 'view' action as arguments
'pass' => array('type'),
/**
* Optionally, define what parameters should be automatically preserved
* when creating URLs/links
*/
'persist' => array('type'),
)
);
Router::connect(
'/:type/:id/:slug',
array(
'controller' => 'posts',
'action' => 'view',
),
array(
/**
* Custom type:
* only allow 'post', 'blog' or 'message' as type here
* to prevent overlapping with 'controllers'
*/
'type' => '(post|blog|message)',
'id' => '[0-9]+',
// Define what should be passed to the 'view' action as arguments
'pass' => array('type', 'id', 'slug'),
/**
* Optionally, define what parameters should be automatically preserved
* when creating URLs/links
*/
'persist' => array('type'),
)
);
首先,路由的顺序很重要,如果多个路由将匹配一个URL,那么将处理第一个匹配的路由
接下来,您可以通过在Router::connect()的最后一个参数中为“type”键设置正则表达式来限制“what”将被视为“type”,就像您对“id”所做的那样。您可以在正则表达式中包含所有有效类型,也可以在正则表达式中添加排除值(例如控制器名称)的“负”部分
大概是这样的:
Router::connect(
'/:type/:action',
array(
'controller' => 'posts',
),
array(
/**
* Custom type:
* only allow 'post', 'blog' or 'message' as type here
* to prevent overlapping with 'controllers'
*/
'type' => '(post|blog|message)',
// Define what should be passed to the 'view' action as arguments
'pass' => array('type'),
/**
* Optionally, define what parameters should be automatically preserved
* when creating URLs/links
*/
'persist' => array('type'),
)
);
Router::connect(
'/:type/:id/:slug',
array(
'controller' => 'posts',
'action' => 'view',
),
array(
/**
* Custom type:
* only allow 'post', 'blog' or 'message' as type here
* to prevent overlapping with 'controllers'
*/
'type' => '(post|blog|message)',
'id' => '[0-9]+',
// Define what should be passed to the 'view' action as arguments
'pass' => array('type', 'id', 'slug'),
/**
* Optionally, define what parameters should be automatically preserved
* when creating URLs/links
*/
'persist' => array('type'),
)
);
啊,好的,听起来不错,如果你能用一个非常棒的例子更新:)@Tim我添加了一些例子,但你需要测试em,如前所述,顺序可能也很重要啊,好的,如果你能用一个非常棒的例子更新:)@Tim我添加了一些例子,但你需要测试em,如前所述,秩序也可能很重要