Phalcon 5-向控制器发送邮件请求导致邮件数据为空



我使用的是php 8.0.15+phalcon 5.0.0beta2的docker设置,我正试图使用fetch api对路由进行一个简单的post请求。

/* inside router.php */
$apiGroup = new RouterGroup();
$apiGroup->setPrefix('/api');
$apiGroup->addPost('/user', 'UserApi::post');
/* somewhere in my controller action */
$data = [
'email' => $this->request->getPost('email', [ Filter::FILTER_EMAIL ]),
'password' => $this->request->getPost('password', [ Filter::FILTER_STRING ]),
];
/* in my js */
fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(someData)
}).then(dostuff);

我的问题是$this->request->getPost('email')返回null,并且在调试时我看到$_POST也是空的。使用$this->request->getRawBody()$this->request->getJsonRawBody()确实会产生结果,因为我的数据实际上就在那里。我完全可以使用getJsonRawBody(),但我想知道为什么会出现这种行为?(我在另一个项目中使用了phalcon 3.*,效果很好(

谢谢。

Phalcon的Request对象的文档解释说,它主要是围绕PHP的原生";superglobals";,例如CCD_ 5。特别是:

$_POST超全局包含一个关联数组,该数组包含在请求中使用application/x-www-form-urlencodedmultipart/form-data作为HTTPContent-Type时通过HTTP POST方法传递给当前脚本的变量。您可以通过调用getPost()方法来检索存储在阵列中的数据

请注意,只有在使用两种特定内容类型时才会填充此数组,特别是浏览器在提交HTML表单时使用的两种内容类型。表单处理是PHP最初的任务,它可以处理文件上传等事情;但它本身并不处理JSON、XML或其他输入类型。

(顺便说一句,该文档有点错误:尽管$_POST的名称不同,但它将为任何具有适当请求体的HTTP方法填充,例如PUT,就像即使方法是POST也会填充$_GET一样。(

在您的请求中,您没有使用这些内容类型,因为您发布的是JSON字符串,因此PHP不会填充$_POST,Phalcon也没有任何内容可以用getPost()读取。

正如您所发现的,有一种单独的方法可以将JSON主体解码为PHP数组:

getJsonRawBody((:获取解码的JSON HTTP原始请求正文

Phalcon 3.4请求文档中根本没有提到JSON,所以我不确定该功能是否发生了更改,您是否记错了,或者您使用了一些额外的插件或配置。

REST教程展示了getJsonRawBody()在5.0版本和3.4版本中的使用情况。

相关内容

  • 没有找到相关文章

最新更新