窗体上的csrf_protection导致“无法启动会话”错误

时间:2013-10-09 19:29:16

标签: symfony guzzle

我有一个Controller动作,它遍历一个实体数组并创建一个Form for 每个,然后在Twig模板中呈现它们,如下所示:

public function siteTestAction() {
    $api = $this->get('product_model');
    $result = $api->findProductByCode("2000082");

    $array_forms = Array();

    foreach ($result as $prod)
    {
        $form = $this->createForm('pos_product', $prod, array('action' => $this->generateUrl('receive_form')));
        $array_forms[] = $form->createView();

    }

    return $this->render('AEBikePOSSyncBundle:Default:array_form.html.twig', array(
        'data' => $array_forms,
    ));
}

加载此错误会导致错误“无法启动会话,因为标题已经由第7行的”“发送。”

这个控制器动作重写了一个完美的不同动作。我尝试消除它们之间的差异,但有很多,例如新的使用Guzzle来使用API​​。几乎所有的差异都在findProductsByCode()方法的后面,它只返回一个实体数组。

堆栈跟踪中的最后三项是:

  • NativeSessionStorage - > start()
  • 在会话 - >开始()
  • 在SessionCsrfProvider - > getSessionId()

所以我开始看作csrf_protection。一旦我在FormType类中禁用csrf_protection,错误就会消失,一切正常。

原始工作操作使用csrf_protection,我可以通过查看表单来源并查看令牌字段来验证。

那么,为什么csrf_protection会在一个操作中导致此错误而不是另一个操作,使用相同的FormType?

**编辑:我在两条路线之间消除了尽可能多的差异,我唯一不能消除的是使用Guzzle下载API而另一个使用cURL。我想我将不得不通过Guzzle文件查看额外的空格或错误的编码?

** EDIT2: 好吧,我把它缩小了,找到了罪魁祸首,但我不知道该怎么办。我使用Guzzle来使用API​​,而我的Guzzle类有一个Listener,它会在每次发送请求时设置一些状态变量。这段代码在我的Guzzle类构造函数中:

    $this->getEventDispatcher()->addListener('request.complete', function(Event $event) {

        $this->status_code = (int) $event['response']->getStatusCode();
        $this->reason_phrase = $event['response']->getReasonPhrase();;
        $this->url = $event['request']->getUrl();

    });

如果删除该块,一切正常。 所以现在问题是,为什么?我当然想保留这个听众。

1 个答案:

答案 0 :(得分:0)

呃,我发现了一个错误的同花顺();我的代码深处的陈述。绝对没有找到那个。这个上有很多红鲱鱼......