Symfony2 |为什么控制器操作执行两次?

时间:2016-05-15 20:50:32

标签: php symfony doctrine-orm

有几天我和Symfony面对一种奇怪的行为。 我有一个动作,由于某种原因我需要在会话中存储随机值作为形式nonce。 nonce被传递给twig模板以供ajax函数使用。

在将nonce发送到相应的操作时,会检查差异nonce值,因此请求拒绝。

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

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

任何人都可以提供帮助吗?

这是有问题的代码:

/**
 * 
 * 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")

1 个答案:

答案 0 :(得分: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" my-form"

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
            }
        });
    });
}