CakePHP';的尾随星形路由语法似乎将HTML帮助程序中的参数加倍

CakePHP';的尾随星形路由语法似乎将HTML帮助程序中的参数加倍,cakephp,routing,wildcard,Cakephp,Routing,Wildcard,我以前使用过CakePHP的贪婪星路由功能,允许URL中的所有附加参数被推送到请求的控制器。这很好,正如HTML助手所期望的那样 引用尾随星语法(双通配符,**)执行相同的操作,但将每个附加参数组合成单个字符串。当我直接转到使用此方法的URL时,这种方法也很有效,但HTML助手似乎将参数加倍,如下所示: Router::connect( '/view/**', array('controller' => 'thing', 'action' => 'view') ); $t

我以前使用过CakePHP的贪婪星路由功能,允许URL中的所有附加参数被推送到请求的控制器。这很好,正如HTML助手所期望的那样

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

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

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

然而它应该是


这个
/**
更多的是用于解析,而不是用于匹配。解析是指获取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
第二个和第三个例子显然是不对的。我猜是路由器出了问题。即使它正确地构造了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
将被解析为一个传递的参数。

谢谢jeremyharris,这很有帮助。它看起来确实像一个bug,所以我将与蛋糕社区一起解决它。这个解决方法太简单了,我很惭愧我没想到,谢谢。