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

Добрый вечер,

Я недавно обновился до 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 нельзя сравнить с другим пользователем в ветке?

1

Решение

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

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

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]