在CakePHP 3.0命名参数已被删除(感谢上帝),支持与其他应用程序框架内联的标准查询字符串参数。
我仍然在努力解决的问题是,在其他MVC框架中,例如ASP.NET,你会传递ActionResult中的参数(与函数相同):
Edit( int id = null ) {
// do stuff with id
}
该方法会将id作为查询字符串传递给:/Edit?id=1
,您可以使用路由来使其非常像:/Edit/1
。
在CakePHP中,但是在函数参数中传递的内容如下:
function edit( $id = null ) {
// do stuff with $id
}
必须作为传递的参数完成,例如:/Edit/1
,它绕过了查询字符串的想法,还需要路由来改进URL。
如果我在该编辑的链接中命名params,如:
$this->Html->link('Edit', array('action' => 'edit', 'id' => $post->id));
然后我必须这样做:
public function edit() {
$id = $this->request->query('id');
// do stuff with $id
}
获取传递的参数id。想到它会在像CakePHP 3.0的ASP.NET中那样在功能中提取它,但事实并非如此。
我更喜欢在编辑链接中为传递的值添加前缀,而不是仅仅传递它们,所以我不必在另一端担心序数,我知道它们是什么等等。
有没有人使用这些方法将数据传递给CakePHP中的方法,并且可以更好地了解正确的处理方式以及3.0版本中的更改将如何改善这一领域的内容......
答案 0 :(得分:10)
CakePHP 3.0中有几种类型的请求参数。让我们回顾一下:
查询字符串:使用$this->request->query()
访问,不会作为参数传递给控制器函数,为了建立您需要做的链接Html->link('My link', ['my_query_param' => $value])
传递参数:特殊类型的参数是控制器函数作为参数接收的参数。可以作为参数或通过检查$this->request->params['pass']
来访问它们。您可以根据路径构建带有传递args的链接,但对于默认路径,您只需将位置参数添加到链接,如Html->link('My link', ['action' => view, $id, $secondPassedArg, $thirdPassedArg])
请求参数:传递的参数是此参数的子类型。请求参数是可以从可以从路径中提取的信息中存在于请求中的值。参数在其一生中可以转换为其他类型的参数。
考虑这条路线:
Router::connect('/articles/:year/:month/:day', [
'controller' => 'articles', 'action' => 'archive'
]);
我们已经使用该路线有效创建了3个请求参数:year
,month
和day
,可以使用$this->request->year
$this->request->month
和{{ 1}}。为了建立一个链接我们做:
$this->request->day
请注意,由于路径指定了这些参数,因此它们不会转换为查询字符串参数。现在,如果我们想将这些转换为传递参数,我们将改为连接此路由:
$this->Html->link(
'My Link',
['action' => 'archive', 'year' => $y, 'month' => $m, 'day' => $d]
);
我们的控制器功能现在看起来像:
Router::connect('/articles/:year/:month/:day',
['controller' => 'articles', 'action' => 'archive'],
['pass' => ['year', 'month', 'day']]
);