【问题标题】:CakePHP 3.0 query string parameters vs passed parametersCakePHP 3.0 查询字符串参数与传递参数
【发布时间】:2014-01-28 19:52:06
【问题描述】:

在 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 版中的更改将如何改进这方面的事情...

【问题讨论】:

    标签: php cakephp cakephp-3.0


    【解决方案1】:

    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 个请求参数:yearmonthday,并且可以使用 $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) {
      ...
    }
    

    【讨论】:

    • 为什么 CakePHP 允许您在类型之间进行选择,因为它在 ASP.NET 中看起来更清晰,从我到目前为止所看到的默认为查询字符串,直到您使用路由器使它变得漂亮版本(您在 CakePHP 中默认通过传递的参数看到)。感谢 Jose 提供的信息,非常感谢。
    猜你喜欢
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多