首页 > 解决方案 > CakePHP ServerRequest getQuery() 在 Helper 类中返回空白数组

问题描述

我对 Cake 比较陌生,但我的项目有一个相当大的单个控制器文件。随着它越来越大,我发现自己创建了辅助函数(在文件的底部)来清理函数并提高可读性。

它已经到了控制器文件变得如此之大以至于需要进一步重构的地步。我创建了目录/src/Helpers/来存放我的多个会话操作函数,称为SessionManipulator.php

由于 Cake 在请求对象中处理会话,SessionManipulator.php 看起来像这样......

use Cake\Http\ServerRequest;

class SessionManipulator
{

    function __construct() {
        $this->request = new ServerRequest();
    }

你会注意到我对 ServerRequest 类的实例化:$this->request = new ServerRequest();

我的大部分会话操作函数都考虑了在整个程序中设置的各种 GET 变量。问题是,由于某种原因,当我做类似...

if($this->request->getQuery('pid')) {
    return true;
} else {
    return false;
}

表现得很奇怪。当我在调用函数之前进行故障排除并尝试查看所有 GET 数据时,例如...

print_r($this->request->getQuery());

返回空白:

Array
(
)

同时,一个类似的print_r($_GET); 显示我所追求的数据:

Array
(
    [pid] => 32
)

所以,我认为有些事情我不明白。

也许 Cake 的 ServerRequest 类将 GET/POST 数据存储到一个孤立的环境中,我需要让这个 Helper 类可以访问?


更新:

我发现更新:

$this->request = new ServerRequest();

to 

$this->request = Router::getRequest();

修复一切,但我不确定我明白为什么......:|

标签: phpclasscakephphelper

解决方案


通过使用以下代码行,您正在创建 ServerRequest 的新对象。这是一个全新的对象,它没有原始 HTTP 请求的任何属性。

$this->request = new ServerRequest();

Cakephp 在传入的 HTTP 请求期间自动创建一个 ServerRequest 对象。此对象在 Controller、View 和 Helper 中可供您使用。只有这个 Object 具有传入请求的所有属性。此对象可作为$this->request. 您正在创建一个新对象,而不是使用 Cakephp 提供的对象。您应该能够在 Helper 中使用 $this->request 本身来访问 Cakephp 对象。您不需要创建它的新实例。

您可以更改您的助手类,如下所示

use Cake\Http\ServerRequest;

class SessionManipulator
{

    function __construct() {
        //No need to create a New Instance of ServerRequest.
        //$this->request = new ServerRequest(); 
    }

    function checkPid() {
        //You should still be able to access SereverRequest using $this->request.  
        if($this->request->getQuery('pid')) {
           return true;
        } else {
           return false;
        }
    }
}

推荐阅读