在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变量的值正确:
但是$ date是null
。
答案 0 :(得分:7)
标头或代码中的类似内容没有问题,并且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
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function index(Request $request)
{
$date = $request->get('date');
}
}
在您的示例中,您正在执行$request->request->get('date')
看起来不正确。但是由于您未显示要在何处创建$request
,因此我们不确定。
上面的代码已通过您的jQuery AJAX POST请求进行了测试,并且有效。这部分没有天生的错误。而且完全可以使用get()
访问POST变量。
答案 1 :(得分:0)
您正在发送JSON字符串,因此您需要使用:
$content = $request->getContent();
,然后您需要使用json_decode对其进行解析。
干杯。
答案 2 :(得分:0)
您可能会遇到的问题与Accept HTML标头有关,PHP将PHP标头将变量从主体转换为$ _POST,而Symfony使用$ _POST填充请求对象数据。
要获得此行为,您需要使用标题application/x-www-form-urlencoded
或multipart/form-data
。
要检查是否确实存在这种情况,您需要使用代码:
dump($request->getContent());
如果它充满变量,则表示由于MIME不匹配,PHP不会将它们转换为$ _POST;如果不是,则表示请求不正确。
访问post变量的常规方法是:
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
}
有用的链接来检查:
答案 3 :(得分:-1)
尝试添加内容类型,将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;
这样的use语句public function post( Request $request )
那样注入请求$data = json_decode( $request->getContent(), true);
之类的数据。在此示例中,您将数据作为assoc数组。答案 4 :(得分:-1)
可能的解决方案:
$post_data = json_decode($request->getContent(), true);
$date = $post_data['date'];