在 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 的需要。

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

$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 版本中的更改将如何改进该领域的事情......

有帮助吗?

解决方案

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

查询字符串:可以通过以下方式访问 $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 个请求参数: year, monthday 并且可以通过以下方式访问它们 $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) {
  ...
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top