针对多种post类型的cakephp路由

针对多种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('

我使用的是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('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,如前所述,秩序也可能很重要