Как сравнить два объекта учения?

Используя 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?

В моих двух примерах выше, есть ли разница между использованием ==а также ===?

0

Решение

На мой взгляд, самый простой способ — использовать сравнение -> 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 ()).

https://symfony.com/doc/3.4/security/voters.html

1

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

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

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