我想在控制器/动作之前放置一个命名参数以及之后的所有其他内容......
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
匹配是否可行?如果是的话,怎么样?
答案 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'];