CakePHP ServerRequest getQuery() returns Helper 中的空白数组 class

CakePHP ServerRequest getQuery() returns blank array in Helper class

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

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

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

use Cake\Http\ServerRequest;

class SessionManipulator
{

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

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

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

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

行为异常。当我排除故障并尝试在调用函数之前查看所有 GET 数据时,例如...

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

Returns空白:

Array
(
)

与此同时,一个类似的 print_r($_GET); 显示了我想要的数据:

Array
(
    [pid] => 32
)

所以,我觉得有些事情我不明白。

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


更新:

我发现更新:

$this->request = new ServerRequest();

to 

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

修复了所有问题,但我不确定我是否理解为什么...:|

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

$this->request = new ServerRequest();

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

您可以像下面这样更改您的助手Class

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;
        }
    }
}