2015-11-05 2 views
1

Добрый вечер,Symfony 2.7.6 глобальные расширения & устаревшие предупреждения: app.user нельзя сравнивать с другими пользователями

Я недавно обновлен до Symfony 2.7.6. Кроме того, это помогло мне настроить HWIOAuthBundle, я заметил ошибку в шаблоне, который раньше делался.

Следующий тест никогда не действует, хотя я связан как создатель этого события!

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

Creator выглядит следующим образом:

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 developper Remi Collet, сказав, что эти 2 устаревших вызова могут привести к ошибке Twig и загрузить простой патч для ветки (v1.23), но этот патч не помог.

Я взял более старую версию веткой/веткой, которая помогла мне решить предупреждение об устаревших методах. Но тест app.user все еще сломан ...

У кого-нибудь есть идея, почему мое глобальное расширение, app.user не может сравниться с другим пользователем в twig?

ответ

1

Это не имеет никакого отношения к предупреждениям об устаревании. Они существуют только для того, чтобы сообщить вам, что ваш код может не работать с будущими версиями, но в текущем все все в порядке.

Проблема в том, что у вас может быть несколько объектов-пользователей, содержащих данные одного и того же пользователя. Если вы используете только Doctrine, он даст вам тот же объект для пользователя каждый раз, когда вы его попросите. Вот почему вы иногда можете сравнивать объекты.

Но управление сеансом (которое обеспечивает app.user) может не обязательно полагаться на Доктрину. В целях производительности он может хранить объект каким-то другим способом, как в самом сеансе.

Итак, у вас есть два объекта пользователей одного и того же пользователя: один из сеансов управления и один из Doctrine (event.getCreator()). И если вы сравните эти два объекта, PHP, конечно, найдет, что это два разных объекта (хотя они содержат одни и те же данные) и возвращают false по этому сравнению.

Решение может заключаться в проверке на скалярное значение в пользовательских объектах, например app.user.getId() == event.getCreator().getId() или что-то в этом роде. Таким образом, вы сравниваете значения вместо экземпляров.

+0

Большое спасибо! Я был уверен, что в Symfony два объекта, которые будут переданы одному и тому же объекту, будут действительны для теста '=='. – Louis

+0

Yep, Symfony и Doctrine делают очень хорошую работу, создавая впечатление, что объект объекта всегда отображается на запись в базу данных. Но это такие исключения, где вы все еще замечаете внутреннюю работу. – hanzi