5

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

不过,我仍然难以理解的是,在其他 MVC 框架中,例如 ASP.NET,您将在 ActionResult 中传递参数(与函数相同):

Edit( int id = null ) {

    // do stuff with id

}

并且该方法将通过 id 作为查询字符串传递:/Edit?id=1并且您将使用 Routing 使其非常像:/Edit/1

然而,在 CakePHP 中,函数参数中传递的任何内容,例如:

function edit( $id = null ) {

    // do stuff with $id

}

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

如果我将链接中的参数命名为该编辑,例如:

$this->Html->link('Edit', array('action' => 'edit', 'id' => $post->id));

然后我必须这样做:

public function edit() {

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

    // do stuff with $id

}

获取传递的参数id。本以为它会像在 ASP.NET for CakePHP 3.0 中那样在函数中提取它,但事实并非如此。

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

有没有人在 CakePHP 中尝试过将数据传递给他们的方法的这些方法中的任何一种,并且可以更清楚地了解正确的做事方式以及 3.0 版中的更改将如何改进这方面的事情......

4

1 回答 1

10

CakePHP 3.0 中有几种类型的请求参数。让我们回顾一下:

Query String : 被访问$this->request->query(),不作为参数传递给控制器​​函数,为了建立一个你需要做的链接Html->link('My link', ['my_query_param' => $value])

传递的参数:特殊类型的参数是控制器函数作为参数接收的参数。它们可以作为参数访问,也可以通过检查来访问$this->request->params['pass']。您根据路由使用传递的参数构建链接,但是对于默认路由,您只需将位置参数添加到链接中,例如Html->link('My link', ['action' => view, $id, $secondPassedArg, $thirdPassedArg])

请求参数:传递的参数是此参数的子类型。请求参数是可以从路由中提取的信息中存在于请求中的值。参数可以在其生命周期内转换为其他类型的参数。

考虑这条路线:

Router::connect('/articles/:year/:month/:day', [
  'controller' => 'articles', 'action' => 'archive'
]);

我们已经使用该路由有效地创建了 3 个请求参数:yearmonth并且day可以使用$this->request->year $this->request->month和访问它们$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']]
);

我们的控制器函数现在看起来像:

function archive($year, $month, $day) {
  ...
}
于 2014-01-10T07:58:56.420 回答