Использование 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 возвращать тот же экземпляр в token manager и в запросе доктрины.
http://php.net/manual/en/language.oop5.object-comparison.php
Я не могу комментировать, может ли doctrine / symfony возвращать один и тот же экземпляр для обеих ссылок на объекты. Я не знаю. И, честно говоря, никто, вероятно, не сможет предсказать это с уверенностью (особенно если учесть такие вещи, как кеширование), если у них нет очень сложных знаний об исходном коде doctrine / symfony.
О, и имейте в виду, что
$this->get('security.token_storage')->getToken()->getUser()
не всегда возвращает объект пользователя. Например, он может возвращать текст, если пользователь не вошел в систему.
Поэтому я бы также добавил проверку внутри if (перед сравнением идентификаторов), чтобы проверить, действительно ли $ user является фактическим объектом-членом. В противном случае вы можете получить исключение при попытке доступа к методу getId ().
$user instanceof Member
Между прочим, если вы хотите обрабатывать такие вещи правильным образом Symfony, держите свой контроллер компактным и чистым и красиво отделите свой код, вы должны создать и зарегистрировать избирателя и использовать что-то вроде
if ($this->isGranted('view', $profile)){...}
Остальная часть кода избирателя - это слишком много, чтобы здесь цитировать, но даже если указанная ниже ссылка на руководство не работает, вы сможете легко найти информацию об избирателях, выполнив поиск в Google.
TL; DR заключается в том, что вы указываете голосующих за доступ как помеченные услуги (например, ProfileVoter). Эти избиратели получают действие (например, представление) и экземпляр субъекта (например, $ profile) в качестве параметров, а затем используют свой внутренний код, чтобы решить, имеет ли пользователь токена право выполнять действие с экземпляром субъекта (вернуть $ user instanceof Member && $ user-> getId () === $ profile-> getUser () -> getId ()).
Следуйте руководству: php.net/manual/en/language.oop5.object-comparison.php