在Symfony的3.2控制器中看不到POST变量

时间:2017-06-02 12:09:52

标签: php rest symfony

调试器在请求中显示 POST数据,但我无法通过$request->get('foo');获取

$request->request->all();给出数组[0]

我的Ajax POST请求(由AngularJS提供):

...
    $http.post('http://admin/about-company/setJSONObj',
        {foo: 'bar'}
    );

我的控制器在评论中有调试信息(Symfony 3.2.9):

use Symfony\Component\HttpFoundation\Request;
    ...
    public function updateAction(Request $request)
        {
             $foo = $request->get('foo'); // null
             $requestType = $request->getContentType(); // json
             $content = $request->getContent(); // {"foo":"bar"}

我在Symfony 2.7项目中使用了这些方法,它运行良好,但我不确定,在这种情况下发生了什么?

另外,也许有任何Symfony框架配置变量告诉不要解析POST数据,或者在缓存请求时隐藏它?

3 个答案:

答案 0 :(得分:1)

对于POST请求是:

if (e.keyCode == 13) {
    e.preventDefault()
    e.target.blur()
    window.getSelection().removeAllRanges()
}

答案 1 :(得分:0)

尝试将FormData用于客户端ajax的调用

例如:尝试类似

的内容
var formData = new FormData();
formData.append('foo', 'bar')

  $http.post('http://url',
       formData
  );

好的,我没注意你用json这样, 您不会在请求中获得$ foo的内容,但您需要json_decode $content

所以保持发送数据的方式相同:

$http.post('http://admin/about-company/setJSONObj',
    {foo: 'bar'}
);

你只需要打电话

use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
    ...
    /**
    * @Route("/setJSONObj", name="admin_pages_set_ajax_obj")
    * @Method("POST")
    */
    public function updateAction(Request $request)
        {
             $foo = $request->get('foo'); // null
             $requestType = $request->getContentType(); // json
             $content = $request->getContent(); // {"foo":"bar"}
             $data = json_decode($content, true);
             dump($data['foo']); // "foo"
             //And you can know replace the data of the request. So
             $request->request->replace($data);

我的猜测是因为symfony需要'Content-Type' 'application/x-www-form-urlencoded',但默认情况下Angular会有application/json(因此您可以覆盖$http.post来电时的标头。

答案 2 :(得分:0)

事实证明,我的错误是在发布JSON时期望$request->request->all();中的POST变量:请参阅解释https://www.toptal.com/...

要使用Symfony创建REST api,使用FOSRestBundle是正常的:请参阅body listener。所以,它以优雅的方式解决了我的问题。

此外,@henrily建议有人可以使用workaroud,但这只是一种解决方法。