Symfony2 - app.user 未与数据库同步

Symfony2 - app.user not synced with database

我有一个名为大厅的页面,用户可以在其中接受好友请求。接受好友请求会导致此操作:

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 设置为更新用户?

当我使用转发而不是重定向时它可以工作,但我不想使用它,因为转发不会更改 URL。

我还注意到有时使用 class 命名的 Proxies/.../User 而不是 User。这可能与我的问题有关吗? 感谢您的帮助,我已经坚持了好几天了...

您需要为 $request 字段

中的 Friendship class 关系添加级联选项

更多信息http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-associations.html#transitive-persistence-cascade-operations

您在删除好友请求时并没有更新实际关系。当您执行 removeElement 时,您只是在内存中删除它,直到将 senderreceiver 设置为空。

您可以手动完成此操作,例如..

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

或者您可以将其添加到 add/remove 以自动完成,例如..

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

看来我找到了解决办法:

我替换了:

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

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

现在重定向后,无需重新加载页面即可显示新朋友。

虽然我不明白这两行之间有什么区别。有人可以解释一下吗?