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

时间:2014-01-10 00:40:49

标签: php cakephp cakephp-3.0

在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版本中的更改将如何改善这一领域的内容......

1 个答案:

答案 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个请求参数:yearmonthday,可以使用$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']]
);