php - 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();
修复一切,但我不确定我明白为什么......:|
解决方案
通过使用以下代码行,您正在创建 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;
}
}
}
推荐阅读
- node.js - Npm 认为我在 Windows 上?
- ios - matchedGeometryEffect 动画不流畅
- javascript - 尝试检查用户是否登录时的useEffect无限循环
- electron - 处理
- grafana - InfluxDB 和 NodeRED
- html - CSS问题:相同的代码在codepen中有效,但在本地系统中无效
- excel - 如何确保EXCEL在修改后以毫秒为单位保存正确的单元格时间格式
- python - 获取列名作为具有相同列值的新列
- android - flutter_session 和 shared_preferences 在颤振中不能一起工作?
- javascript - 如何创建 JavaScript 库