2016-05-15 3 views
0

Его было несколько дней, когда я столкнулся с странным поведением с Symfony. У меня есть действие, в котором по какой-то причине мне нужно сохранить случайное значение как форму nonce в сеансе. Nonce передается шаблону ветви, который будет использоваться функцией ajax.Symfony2 | Почему действие контроллера выполняется дважды?

При отправке 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") 
+0

Я использую Symfony 2.8 –

+1

Самая простая причина - это, как правило, правильный ответ. Вероятно, ваша функция ajax дважды вызывает URL. Вы должны отлаживать полный запрос - это должно быть очень очевидно, если этот метод вызывается более одного раза через ajax. – Richard

+0

Спасибо, Ричард, но это было частью моих тестов. Я поставил строгий мониторинг взаимодействия с сервером и клиентом, чтобы убедиться, что нет дополнительных запросов, отправленных с сервера на сервер. Я также проверил количество запросов Doctrine на стороне сервера, которые были идентичны. Помните, что ajax вызывает другое действие, и я изменил маршрут, чтобы исправить проблему. Если ajax был проблематичным, изменение маршрута не помогло. –

ответ

0

У меня была аналогичная проблема, несколько дней назад, и, как сказал Ричард, проблема в том, чтобы найти в Js части моего приложения. В моем случае я использую метод jQuery on() из-за динамического содержимого на моей странице, а обработчики событий «накапливаются» в определенных обстоятельствах. Мне пришлось использовать метод 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(); 
    //... 
}); 

Чтобы решить мою проблему, я должен был добавить $("body").off("submit", "**"); в моей функции initializeForm, чтобы очистить все обработчик событий, присоединенных к элементу с идентификатором «моей-формой»

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

Спасибо Руби, пожалуйста, просмотрите мой комментарий к комментарию Ричарда –

Смежные вопросы