Symfony 2.7.6 全局扩展和弃用警告:app.user 无法与其他用户进行比较

Symfony 2.7.6 global extensions & deprecated warnings : app.user can't be compared with other users

晚上好,

我最近升级到 symfony 2.7.6。除了它帮助我设置 HWIOAuthBundle 之外,我注意到之前运行良好的模板中的一个错误。

以下测试永远无效,尽管我是此活动的创建者!

{% if event.getCreator() == app.user %}

创作者看起来像这样:

class Event implements EventInterface
{

/**
 * @ORM\ManyToOne(targetEntity="FS\UserBundle\Entity\User", cascade={"persist"}, fetch="EAGER")
 *
 * @ORM\JoinColumn(referencedColumnName="id", nullable=false, onDelete="CASCADE")
 */
private $creator;

public function getCreator()
{
    return $this->creator;
}
...

我开始在分析器中搜索并发现 Twig_ExtensionInterface::getGlobals()Twig_ExtensionInterface::initRuntime() 在 Symfony 2.7.6 中被弃用(在我的应用程序中)。

然后我从 Twig 开发者 Remi Collet 那里读到 post,说这 2 个已弃用的调用会使 Twig 测试失败,并为 twig (v1.23) 上传了一个简单的补丁,但这个补丁没有'帮不上忙

我用的是老版本的twig/twig,它帮我解决了deprecated method warning。但是app.user测试还是坏了...

有人知道为什么我的全局扩展 app.user 无法与 twig 中的其他用户进行比较吗?

它与弃用警告无关。它们的存在只是为了通知您,您的代码可能不适用于 未来的 版本,但在当前版本中一切都很好。

问题是您可以有多个包含同一用户数据的用户对象。如果你只使用 Doctrine,它会在你每次请求时为用户提供相同的对象。这就是为什么您有时可以比较对象。

但是会话管理(提供app.user)可能不一定依赖于 Doctrine。出于性能目的,它可能会以其他方式存储对象,例如在会话本身中。

所以现在你有两个 同一用户的用户对象:一个来自会话管理,一个来自 Doctrine (event.getCreator())。如果你比较这两个对象,PHP 当然会发现它们是两个不同的对象(即使它们包含相同的数据)并且return false 在那个比较中。

一种解决方案可能是检查用户对象中的标量值,例如 app.user.getId() == event.getCreator().getId() 或类似的东西。这样你就可以比较 values 而不是 instances.