2016-05-15 117 views
0

它已经有几天了,我正面临Symfony奇怪的行为。 我有一个行动,其中由于某种原因,我需要在会话中存储随机值作为表单随机数。 nonce被传递给树枝模板以供ajax函数使用。Symfony2 |为什么控制器操作执行两次

在向对应的操作发送nonce时,会检查差异nonce值,因此请求会被拒绝。

测试显示该操作由Symfony执行两次,因此将存储新的随机数而不更新前端。我无法确定原因。

经过数百次测试后,我发现路线上的微小变化可以解决问题,但我不相信这是最终的解决方案,我找不到根本原因。

任何人都可以帮忙吗?

这里是有问题的代码:

/** 
* 
* Condo Apartments management 
* 
* @Route("/condo/apartment") 
*/ 
class ApartmentController extends Controller 
{ 
    /** 
    * Index Condo Apartments 
    * 
    * @Route("/edit/{id}/{apartment}", name="edit_apartment") 
    * @Route("/manage/{id}", name="manage_apartments") 
    * @ParamConverter("apartment", class="RimakishCondominiumBundle:Apartment", options={"mapping":{"apartment"="id"}}) 
    * @Method({"GET", "POST"}) 
    */ 
    public function indexApartmentsAction(Request $request, Complex $complex, Apartment $apartment=null){ 


    $session = $request->getSession(); 
    $nonce = sha1(uniqid()); 
    if($session->has('nonce')){ 
     $session->remove('nonce'); 
    } 

    $session->set('nonce', $nonce); 

我只是改变了第一条路线如下,它的工作。现在我需要知道这个问题的根源。

* @Route("/{id}/{apartment}/edit", name="edit_apartment") 
+0

我正在使用Symfony 2.8 –

+1

最简单的原因通常是正确的答案。看起来你的ajax函数可能会调用URL两次。你应该调试完整的请求 - 这应该是非常明显的,如果这个方法被通过ajax多次调用。 – Richard

+0

谢谢理查德,但那是我测试的一部分。我对服务器 - 客户端通信进行了严格的监控,以确保没有从浏览器发送到服务器的额外查询。我也检查了相同的服务器端的Doctrine查询的数量。请记住,ajax调用另一个操作,我修改了Route来解决问题。如果ajax有问题,改变路线也无济于事。 –

回答

0

我有一个类似的问题,前几天,和理查德说,这个问题是我的应用程序的JS部分被发现。 在我的情况下,我使用on()jquery方法,因为我的页面中有动态内容,事件处理程序在某些特定情况下“积累”。 我不得不使用off()方法,这解决了我的多个ajax调用。

我的代码如下所示:

// A function executed when clicking a button with class ".modal-form" 
$('body').on('click', '.modal-form', function (e) { 
    //...(loading a form in a modal) 
    //calling a function that initializes my form 
    initializeForm(); 
    //... 
}); 

解决我的问题,我不得不在我的功能initializeForm添加$("body").off("submit", "**");清除附着在单元所有事件处理程序ID为“我型”

function initializeForm(){ 
    $("body").off("submit", "**"); // I had to add this to avoid sending multiple ajax 
             //requests in case the button with ".modal-form" 
             //class has been clicked several times 
    $('body').on('submit', '#my-form', function(e) { 
     //... 
     $.ajax({ 
      // That request was being sent several times 
      } 
     }); 
    }); 
} 
+0

谢谢Roubi,请查看我对Richard评论的评论 –

相关问题