如何连接以自定义元素开头的路线?

时间:2013-10-03 11:48:16

标签: cakephp cakephp-2.3

我想在控制器/动作之前放置一个命名参数以及之后的所有其他内容......

e.g:

domain.com/named_parameter/controller
domain.com/named_parameter/controller/action
domain.com/named_parameter/controller/action?key=val
domain.com/named_parameter/controller/action/other_params

我不关心如何在named_parameter之后构建网址的其余部分。我只想把参数放在前面:)

而且,我还需要在前工作中制作没有命名参数的标准URL。

e.g:

domain.com/controller
domain.com/controller/action
domain.com/controller/action?key=val
domain.com/controller/action/other_params

为简单起见,只有以foo_

开头的命名参数才会匹配

e.g:

domain.com/foo_biz/controller/action
domain.com/foo_zip/controller/action

匹配是否可行?如果是的话,怎么样?

1 个答案:

答案 0 :(得分:2)

这一切都在食谱中有所描述,见

看起来好像你在谈论命名参数(从CakePHP 3.0中删除,因此最好现在停止使用它们),因为它们是name:value格式,而只是关于普通路径组件。

您可以轻松定义自己的路由元素并使用正则表达式匹配选项来确保路由仅连接到元素以foo_开头的URL。利用:controller:action元素,您的路径将连接到与没有foo_路径组件的路径相同的控制器/操作。

将路线放在之前以使它们优先,你应该是好的。

$options  = array(
    'store' => 'foo_[^\/]+', // matches everything that starts with `foo_`
    'persist' => array('store')
);

/**
 * Connects:
 *
 * /foo_storename/controller/action
 * /foo_storename/controller/action/whatever/etc...
 * /foo_storename/controller/action?bar=baz&etc...
 */
Router::connect(
    '/:store/:controller/:action/*',
    array(),
    $options
);

/**
 * Connects:
 *
 * /foo_storename/controller
 * /foo_storename/controller?bar=baz&etc...
 */
Router::connect(
    '/:store/:controller',
    array('action' => 'index'),
    $options
);

/**
 * Connects:
 *
 * /foo_storename
 * /foo_storename?bar=baz&etc...
 */
Router::connect(
    '/:store',
    array('controller' => 'index', 'action' => 'index'),
    $options
);
然后可以在控制器中的请求对象上访问

store,神奇地将其作为请求对象的属性:

$this->request->store;

或明确地在params属性中:

$this->request->params['store'];