Добрый вечер,
Я недавно обновился до 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, в котором говорилось, что эти 2 устаревших вызова могут привести к сбою теста Twig, и загрузил простой патч для twig (v1.23), но этот патч не помог.
Я взял более старую версию веточка / веточка, который помог мне решить устаревший метод предупреждения. Но тест app.user все еще не работает …
У кого-нибудь есть идея, почему мое глобальное расширение app.user нельзя сравнить с другим пользователем в ветке?
Это не имеет ничего общего с предупреждениями об устаревании. Они существуют только для информирования вас о том, что ваш код может не работать с будущее версии, но в текущей все все в порядке.
Проблема в том, что вы можете иметь более одного объекта пользователя, содержащего данные одного и того же пользователя. Если вы используете только Doctrine, он будет выдавать вам один и тот же объект для пользователя каждый раз, когда вы запрашиваете его. Вот почему вы можете иногда сравнивать объекты.
Но управление сеансом (что обеспечивает app.user
) не обязательно полагаться на доктрину. В целях производительности он может хранить объект другим способом, например, в самом сеансе.
Итак, теперь у вас есть два объекты пользователя для одного и того же пользователя: один из управления сессиями и один из Doctrine (event.getCreator()
). И если вы сравните эти два объекта, PHP, конечно, обнаружит, что это два разных объекта (даже если они содержат одинаковые данные) и вернет false
на этом сравнении.
Решением может быть проверка скалярного значения в пользовательских объектах, например app.user.getId() == event.getCreator().getId()
или что-то типа того. Таким образом, вы сравниваете ценности вместо экземпляры.
Других решений пока нет …