0

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

例如:

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

我不在乎 URL 的其余部分在named_parameter. 我只想把参数放在前面:)

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

例如:

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

为简单起见,命名参数仅在以foo_

例如:

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

是否可以匹配?如果是,如何?

4

1 回答 1

2

这一切都在食谱中描述,请参阅

看起来您实际上并不是在谈论命名参数(从 CakePHP 3.0 起已删除,所以今天最好停止使用它们),因为它们是name:value格式的,而只是关于普通路径组件。

您可以轻松定义自己的路由元素并使用正则表达式匹配选项来确保路由仅连接到元素以foo_. 利用:controllerand元素,您的路由将连接到与没有路径组件: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'];
于 2013-10-03T16:06:24.220 回答