2015-03-14 3 views
1

У меня есть страница, называемая лобби, в которой пользователь может принять запрос друга. Прием запроса на друга приводит к этому действию:Symfony2 - app.user не синхронизирован с базой данных

public function acceptFriendRequestAction($requestId) 
{ 
    $user = $this->getUser(); 

    // Here $user is modified and changes are saved in database 

    return $this->redirect('ACAppBundle:Lobby:index'); 
} 

Шаблон визуализируется, с помощью app.user, чтобы показать друзьям и запросы. Однако изменения в базе данных не учитываются. Пользовательский объект такой же, как и до acceptFriendRequestAction. Когда страница обновляется, app.user синхронизируется с базой данных.

Зачем мне нужно обновить страницу, чтобы увидеть изменения в базе данных? Как установить app.user в качестве обновленного пользователя?

Когда я использую forward вместо перенаправления, он работает, но я не хочу использовать это, потому что forward не изменяет URL.

Я также заметил, что иногда вместо пользователя используется класс Proxies /.../ User. Может ли это иметь какое-то отношение к моей проблеме? Спасибо за помощь, я застрял на этом в течение нескольких дней ...

+0

Вы пробовали промывку после удаления, но перед следующим упорством? – qooplmao

+0

Спасибо за ваш ответ! Я пробовал это, однако, запрос удаляется после удаления. Я проверил это, извлекая пользователя из базы данных, используя его id ('$ this-> getUser-> getId()) перед перенаправлением. Запрос удаляется. Однако в действии индекса это не так. – jreid

+0

Можете ли вы показать отношения между двумя моделями (get/set из запроса и add/remove/get от пользователя)? – qooplmao

ответ

0

Таким образом, кажется, что я» ве нашли решение:

я заменил:

return $this->redirect('ACAppBundle:Lobby:index'); 

с

return $this->redirect($this->generateUrl('ac_app_lobby')); 

Теперь после перенаправления, новый друг показан без необходимости перезагрузки страницы.

Я не понимаю, в чем разница между двумя линиями. Может ли кто-нибудь объяснить это?

1

Вам необходимо добавить параметры каскадного для отношений в классе дружбы за $ поле запроса

Больше информации http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-associations.html#transitive-persistence-cascade-operations

+0

Я добавил каскад в класс пользователя: 'code' @ORM \ OneToMany (targetEntity =" AC \ FriendBundle \ Entity \ FriendRequest ", mappedBy =" receiver ", cascade = {" remove "}) */ \t защищен $ PendingRequests; Нет результата ... И в классе дружбы, $ request поле имеет cascade remove and persist – jreid

+0

Попробуйте добавить cascade persist в объект дружбы для поля $ request –

+0

Для $ pendingRequests не требуется удаление каскада ... Cascade remove mean удалить объекты FriendRequest при удалении пользователя –

0

Вы Арен Не обновляйте фактические отношения при удалении запроса дружбы. Когда вы делаете removeElement, вы просто удаляете его в памяти до тех пор, пока не установите sender или receiver на нуль.

Вы можете сделать это вручную, как ..

$user->removePendingRequest($request); 
$request->setSender(null); 
// or $request->setReceiver(null); 

Или вы можете добавить его в добавить/удалить, чтобы сделать это автоматически, как ..

public function removeFriendship(FriendshipInterface $friendship) 
{ 
    if ($this->friendships->contains($friendships)) { 
     $this->friendships->removeElement($friendships); 
     $friendship->setSender(null); 
     // or $friendship->setReceiver(null); 
    } 
} 
+0

Как вы можете видеть в действии acceptFriendRequest, вот что я сделал: $ request-> setReceiver (null); – jreid

+0

О да, пропустил это – qooplmao

+0

У меня была эта проблема. Помещение непосредственно в функцию удаления - хорошая идея! Обратите внимание, что когда страница обновляется, запрос друга больше не отображается. Как будто обновление страницы вызывает новый вызов базы данных для извлечения обновленного пользовательского объекта. Спасибо за вашу помощь. – jreid

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