0

我以前使用过带有贪心星的 CakePHP 的路由功能,允许将 URL 中的所有附加参数推送到请求的控制器。这可以正常工作,并且与 HTML Helper 一样。

参考CakePHP 的书,尾随星形语法(双通配符,**)执行相同的操作,但将每个附加参数组合成一个字符串。当我直接转到使用此方法的 URL 时,这也很有效,但 HTML Helper 似乎将参数加倍,如下所示:

Router::connect(
  '/view/**', 
  array('controller' => 'thing', 'action' => 'view')
);

$this->Html->link(
  'title here', 
  array('controller' => 'thing', 'action' => 'view', 'abc', 'def'
));

http://website.com/thing/view/abc/defabc/def

而它应该是

http://website.com/controller/view/abc/def

4

1 回答 1

1

更多的/**是用于解析,而不是用于匹配。解析是当您获取 url 的字符串版本并将其转换为 Cake 用来指向资源的数组时,而匹配是获取基于数组的 url 并根据您的路由转换为字符串。

Router::connect(
  '/view/**', 
  array('controller' => 'thing', 'action' => 'view')
);
// input
Router::parse('/view/something/here/for/you');
// output
array(
  'controller' => 'thing',
  'action' => 'view',
  'pass' => array('something/here/for/you'),
  'named' => array()
);

// input
Router::url(array(
  'controller' => 'thing',
  'action' => 'view',
  'something',
  'here'
));
// output
/view/something/heresomething/here

// input
Router::url(array(
  'controller' => 'thing',
  'action' => 'view',
  'something/here'
));
// output
/view/something%2Fheresomething%2Fhere

第二个和第三个例子显然是不对的。估计是路由器的BUG 即使它正确构造了 url,也无法解析它,因为它/**会变成something/heresomething/here单个传递的参数。

作为一种解决方法,您可以排除所有传递的参数并将其添加到您的链接中:

$url = Router::url(array('controller' => 'thing', 'action' => 'view'));
$this->Html->link(
  'title here', 
  $url . 'abc/def'
));
// ends up: /view/abc/def

然后abc/def将被解析为单个传递的参数。

于 2012-10-12T01:18:18.157 回答