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

1

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

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

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

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

Теги:
twig
deprecated
global

1 ответ

1
Лучший ответ

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

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

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

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

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

  • 0
    Большое спасибо ! Я был уверен, что в Symfony два объекта, ссылающиеся на одну и ту же сущность, будут проверять тест '=='.
  • 0
    Да, и Symfony и Doctrine отлично справляются с задачей, создавая впечатление, что объект сущности всегда отображается в записи базы данных. Но это исключения, подобные этим, когда вы все еще замечаете внутреннюю работу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню