Используя symfony 3.4 (php). Как сравнить два объекта, являются ли они одинаковыми?
Мой пример использования следующий: я захожу в систему через
$user = $this->get('security.token_storage')->getToken()->getUser();
и у меня есть идентификатор пользователя в URL, который предоставляется через вызов функции
public function showUserAction(Request $request, Member $userToDisplay) { ...
Теперь я хочу проверить, являются ли эти два пользовательских объекта одинаковыми — в этом случае я бы перенаправил на страницу, которая показывает профиль вошедшего в систему пользователя.
Могу ли я просто сделать
if ($user === $userToDisplay) { ... }
? Как в этом случае проводится сравнение? Что я действительно хочу, так это делать что-то вроде
if ($user->getId() === $userToDisplay->getId()) { ... }
, но мне действительно нравится первое решение из-за его простоты — и оно действительно работает. Но является ли это просто совпадением или именно так предполагается использовать доктрину?
Я знаю из Java, что я бы реализовать equals()
а также hashCode()
-методы — есть ли что-то похожее в PHP?
В моих двух примерах выше, есть ли разница между использованием ==
а также ===
?
На мой взгляд, самый простой способ — использовать сравнение -> getId ().
Его легко прочитать даже новичкам, которым не нужно задумываться о том, как php обрабатывает равенство объектов (== означает одинаковые свойства и класс, === означает одинаковые ссылки на экземпляры) или интересно, может ли symfony / doctrine вернуть тот же экземпляр в менеджер токенов и в доктрине запроса.
http://php.net/manual/en/language.oop5.object-comparison.php
Я не могу комментировать, если doctrine / symfony может возвращать один и тот же экземпляр для обеих ссылок на объекты. Я не знаю. И, честно говоря, никто не может предсказать это с уверенностью (особенно если вы учитываете такие вещи, как кеширование), если у них нет очень сложных знаний об исходном коде доктрины / Symfony.
Ох, и имейте в виду, что
$this->get('security.token_storage')->getToken()->getUser()
не всегда возвращает объект пользователя. Например, он может вернуть текст, если пользователь не вошел в систему.
Поэтому я бы также добавил проверку внутри if (до сравнения идентификаторов), чтобы проверить, действительно ли $ user является действительным объектом Member. В противном случае вы можете получить исключение при попытке доступа к методу getId ().
$user instanceof Member
Кстати, если вы хотите обрабатывать такие вещи надлежащим образом в Symfony, держать свой контроллер в чистоте и чистоте и красиво отделять свой код, вы должны создать и зарегистрировать избирателя и использовать что-то вроде
if($this->isGranted('view', $profile)){...}
Остальной кодекс Избирателя — это слишком много, чтобы цитировать его здесь, но даже если приведенная ниже ссылка на руководство не работает, вы сможете легко найти информацию об избирателях, прибегая к ней.
TLDR заключается в том, что вы указываете доступ избирателей как помеченные услуги (например, ProfileVoter). Эти избиратели получают действие (например, представление) и экземпляр субъекта (например, $ profile) в качестве параметров, а затем используют свой внутренний код, чтобы решить, имеет ли пользователь токена право выполнять действие над экземпляром субъекта (вернуть $ user член instanceof && $ user-> getId () === $ profile-> getUser () -> getId ()).
Других решений пока нет …