【问题标题】:CakePHP ServerRequest getQuery() returns blank array in Helper classCakePHP ServerRequest getQuery() 在 Helper 类中返回空白数组
【发布时间】:2020-01-13 19:11:23
【问题描述】:

我对 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();

解决了所有问题,但我不确定我理解为什么...:|

【问题讨论】:

    标签: php class cakephp helper


    【解决方案1】:

    通过使用以下代码行,您正在创建一个 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;
            }
        }
    }
    

    【讨论】:

    • 接受这个答案,因为它证实了我的怀疑,在这个实例中创建一个新对象不会继承我想要的。我希望如此,但我确信 Cake 有其原因,就像他们所做的那样...... :)
    • 此行为与 Cake 无关。 all 对象在 PHP 中的工作方式非常简单。当您已经可以轻松访问包含您需要的一切的现有对象时,为什么还希望一个全新的对象是现有对象的副本。
    • @GregSchmidt 谢谢格雷格,我明白了。相反,我应该询问 Cake 的 ServerRequest 类是否直接通过 getter/setter 访问 Superglobals。我是在这种假设下,不一定是一个单独的例子。大多数情况下,我之所以这么问,是因为 Cake 有时会表现得有些出人意料,所以我想确认我的怀疑以便更好地理解。谢谢!
    • The manual 涵盖了大部分内容,我想。当然$_GET$_POST$_FILES$_SERVER$_ENV 是。
    猜你喜欢
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多