CakePHP 3.0查询字符串参数vs传递的参数

Cam*_*ron 5 php cakephp cakephp-3.0

在CakePHP 3.0命名参数已被删除(感谢上帝),支持与其他应用程序框架内联的标准查询字符串参数.

我仍然在努力解决的问题是,在其他MVC框架中,例如ASP.NET,你将传递ActionResult中的参数(与函数相同):

Edit( int id = null ) {

    // do stuff with id

}
Run Code Online (Sandbox Code Playgroud)

并且该方法将作为查询字符串传递给id:/Edit?id=1并且您将使用路由使其非常类似于:/Edit/1.

在CakePHP中,但是在函数参数中传递的内容如下:

function edit( $id = null ) {

    // do stuff with $id

}
Run Code Online (Sandbox Code Playgroud)

必须作为传递参数完成,例如:/Edit/1绕过查询字符串的想法,以及路由以改进URL的需要.

如果我在该编辑的链接中命名params,如:

$this->Html->link('Edit', array('action' => 'edit', 'id' => $post->id));
Run Code Online (Sandbox Code Playgroud)

然后我必须这样做:

public function edit() {

    $id = $this->request->query('id');

    // do stuff with $id

}
Run Code Online (Sandbox Code Playgroud)

获取传递的参数id.想到它会在像CakePHP 3.0的ASP.NET中那样在功能中提取它,但事实并非如此.

我更喜欢在编辑链接中为传递的值添加前缀而不是仅仅传递它们,所以我不必在另一端担心序数,我知道它们是什么等等.

有没有人使用这些方法将数据传递给CakePHP中的方法,并且可以更好地了解正确的处理方式以及3.0版本中的更改将如何改善这一领域的内容......

Jos*_*uez 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'
]);
Run Code Online (Sandbox Code Playgroud)

我们已经有效地创造了这条路线3个请求参数:year,monthday他们可以访问$this->request->year $this->request->month$this->request->day.为了建立一个链接我们做:

$this->Html->link(
  'My Link',
  ['action' => 'archive', 'year' => $y, 'month' => $m, 'day' => $d]
);
Run Code Online (Sandbox Code Playgroud)

请注意,由于路径指定了这些参数,因此它们不会转换为查询字符串参数.现在,如果我们想将这些转换为传递的参数,我们将连接此路由:

Router::connect('/articles/:year/:month/:day',
  ['controller' => 'articles', 'action' => 'archive'],
  ['pass' => ['year', 'month', 'day']]
);
Run Code Online (Sandbox Code Playgroud)

我们的控制器功能现在看起来像:

function archive($year, $month, $day) {
  ...
}
Run Code Online (Sandbox Code Playgroud)