Symfony 2.7.6全球扩展&不推荐使用的警告:app.user无法与其他用户进行比较

时间:2015-11-05 03:32:31

标签: php symfony twig global deprecated

晚上好,

我最近升级到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的帖子,说这两个不赞成的调用可以使Twig测试失败,并上传了一个简单的twig补丁(v1.23),但这个补丁没有用。

我使用了旧版本的 twig / twig ,这帮助我解决了已弃用的方法警告。但是app.user测试仍然被打破了......

任何人都知道为什么我的全球扩展,app.user无法与树枝中的其他用户进行比较?

1 个答案:

答案 0 :(得分:1)

它与弃用警告无关。它们仅用于通知您,您的代码可能无法与 future / / em>版本一起使用,但在当前版本中,所有内容仍然正常。

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

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

现在,您为同一个用户提供了两个用户对象:一个来自会话管理,另一个来自Doctrine(event.getCreator())。如果比较这两个对象,PHP当然会发现这些是两个不同的对象(即使它们包含相同的数据)并在该比较中返回false

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