如何在 PHP Symfony 4 中获取 POST 全局变量?
Posted
技术标签:
【中文标题】如何在 PHP Symfony 4 中获取 POST 全局变量?【英文标题】:How to get POST global variable in PHP Symfony 4? 【发布时间】:2019-07-20 05:46:42 【问题描述】:我在 Symfony 4 中获取 POST 全局变量的结果时遇到了一个非常奇怪的问题。
我试过这样:
$date = $request->request->get('date');
这就是我在日历输入的日期更改时实际发送 AJAX 请求的方式:
onSelect: function(date, instance)
$.ajax(
url : 'home',
type : 'POST',
data : 'date':date,
dataType : 'html',
success : function(code_html, statut)
console.log(statut);
,
error : function(resultat, statut, erreur)
,
complete : function(resultat, statut)
);
onSelect 回调成功接收到我想要的日期值。
这个结果显示了 200 个成功代码,其中日期变量的值是正确的:
但是 $date 是null
。
【问题讨论】:
抱歉,您有什么问题?你说哪一点不起作用?var_dump($_POST)
会得到什么?鉴于您的分析器页面显示 POST var 在那里,但它也显示您正在发布到 /,这与 AJAX 请求正在做什么不同?您是否查看过浏览器工具的网络选项卡以了解实际发送到 home
的内容以及响应是什么?
data : 'date':date,
更改为data : date:date,
我认为您的帖子密钥将不再是'date'
,它将变为date
,您的代码将可以工作
@RiggsFolly 结果是一样的。它是双向的
@KubiRoazhon 好的,在过去的某个地方遇到过类似的问题,但不太记得这里是否相关,所以我想我会把它放在锅里作为评论
【参考方案1】:
您的代码中的标头或类似内容没有问题,并且 jQuery 请求是正确的(我测试了您的代码)。
问题可能出在您的 php 代码上,而您的问题中没有。
如果您正确地注入了Request
对象,您可以轻松地使用get()
来检索帖子变量。
例如:
namespace App\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
class VeryDefaultController extends AbstractController
/**
* @Route("/very/default", name="very_default")
* @param Request $request
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function index(Request $request)
$date = $request->get('date');
在您的示例中,您正在执行 $request->request->get('date')
这对于 POST
或 PUT
请求来说很好,但它可能会失败,因为您没有正确注入 Request
对象。
上面的代码已经用你的 jQuery AJAX POST 请求进行了测试,它可以工作。那部分本质上没有错。并且完全可以使用get()
访问 POST 变量。
【讨论】:
由于分析器显示了 post 变量和成功代码,我认为 PHP 部分是正确的。 POST 变量已发送,但我无法获取。 发送POST变量,可以获取。只是你没有正确理解它。在您显示的唯一代码中,您执行$request->request->get()
,这似乎没有多大意义。上面的代码经过测试,可以正常工作。
没有有价值的解决方案,我还是有问题
我不明白你的意思,@Taou。我应该在回答中更正什么?
@TaouBen Request::get()
适用于 GET
和 POST
参数。您所描述的是获取 request body;这不是这个问题试图做的。 (再次,我用他们特定的 AJAX 请求测试了代码)。【参考方案2】:
您正在发送一个 JSON 字符串,因此您需要使用:
$content = $request->getContent();
然后你需要用json_decode
解析它。
【讨论】:
【参考方案3】:可能的解决方案是:
$post_data = json_decode($request->getContent(), true);
$date = $post_data['date'];
【讨论】:
【参考方案4】:您可能面临的问题与 PHP 用来将变量从帖子正文转换为 $_POST
的 Accept HTML 标头有关,而 Symfony 使用 $_POST
来填充请求对象数据。
要获得此行为,您需要使用标头 application/x-www-form-urlencoded
或 multipart/form-data
。
要检查是否确实如此,您需要使用代码:
dump($request->getContent());
如果它充满了变量,则意味着 PHP 没有将它们转换为 $_POST
,因为 MIME 不匹配,如果不是,则意味着请求不正确。
访问后变量的正常方法是:
public function index(Request $request)
dump($request->getContent()); // get raw body of http request
dump($request->request->get('date')); //get converted variable date by php and then by symfony
检查有用的链接:
http://php.net/manual/en/reserved.variables.post.php https://symfony.com/doc/current/introduction/http_fundamentals.html#symfony-request-object【讨论】:
【参考方案5】:尝试添加内容类型,将您的 json 数据字符串化并使用传统的序列化,如下所示:
onSelect: function(date, instance)
var data = 'date':date;
$.ajax(
url : 'home',
type : 'POST',
data : JSON.stringify(data),
contentType: "application/json; charset=utf-8",
traditional: true,
dataType : 'html',
success : function(code_html, statut)
console.log(statut);
,
error : function(resultat, statut, erreur)
,
complete : function(resultat, statut)
);
由于您没有发布控制器代码,我建议您确保:
您有一个类似\Symfony\Component\HttpFoundation\Request;
的使用语句
你正在注入像public function post( Request $request )
这样的请求
您正在读取您的数据,例如$data = json_decode( $request->getContent(), true);
。在此示例中,您将数据作为关联数组。
【讨论】:
以上是关于如何在 PHP Symfony 4 中获取 POST 全局变量?的主要内容,如果未能解决你的问题,请参考以下文章
symfony 4:如何从 RootDir 获取“/public”
如何在 PHP docker 镜像上安装 yarn 和 npm(symfony 4 项目)
Symfony 4,从控制器获取 .env 参数,是不是可能以及如何?