Недавно я наконец начал смещать фокус с D7 на D8, и я перевожу сайт на D8. В D7 я указывал на объекты своей учетной записи как \ stdClass, так как они не были членами какого-либо класса. Однако в D8 они теперь являются членами класса User.
Тем не менее, я нахожу в некотором коде в сети, что люди печатают как Drupal \ Core \ Session \ AccountInterface, а в других местах как Drupal \ user \ UserInterface. Как мы должны определить, какой из них использовать для наших шрифтов, и в чем разница между двумя типами объектов?
Ответы:
UserInterface
простираетсяContentEntityInterface
,EntityChangedInterface
иAccountInterface
. Это означает, что существуют методы, которыеUserInterface
должны иметь объекты, реализующие объект , но реализации объектовAccountInterface
не нужно. Например, естьUserInterface::hasRole()
, ноAccountInterface::getRoles()
; в первом случае есть вспомогательный метод, позволяющий проверить, играет ли объект определенную роль, а во втором случае вам нужно будет написать свой код для этого, получив список ролей с помощьюAccountInterface::getRoles()
.Какой намек следует использовать, приведено в документации. Например,
hook_user_logout()
получает реализацию объекта\Drupal\Core\Session\AccountProxyInterface
, так как получает объект, возвращенный изDrupal::currentUser()
. Видитеuser_logout()
, функция вызываетсяhook_user_logout()
.Иногда документация для ловушки не показывает конкретную подсказку, например, в случае
hook_user_login()
. В этом случае это может помочь увидеть, какая подсказка используется, напримерsystem_user_login()
, из реализаций этой ловушки , которая используетUserInterface
как подсказку для своего аргумента.Если вы не уверены в правильности интерфейса, реализуемого объектом, передаваемым функции (включая хук), используйте в качестве подсказки наиболее общий. В случае, если вы опишите, это будет
AccountInterface
.источник
Как пользовательский интерфейс расширяет AccountInterface типа настройки намек на AccountInterface позволит вам принять оба типа объектов. Вы можете думать о UserInterface как о расширенном AccountInterface, который объявляет несколько дополнительных методов ( hasRole , addRole , removeRole и т. Д.). Я бы использовал интерфейс AccountInterface везде, где это возможно, если вам не нужны некоторые из этих дополнительных методов.
Еще одна деталь, объект UserInterface также должен реализовывать методы из ContentEntityInterface и EntityChangedInterface .
источник
Проверьте документацию для
AccountInterface
:Он находится в
Session
пространстве имен по причине - он представляет собой нечто, что может иметь данные сеанса.В
ContentEntityInterface
иEntityChangedInterface
интерфейсах распространяемыхUserInterface
вам сказать , что он представляет другую концепцию:A
UserInterface
представляет собой полную учетную запись пользователя Drupal, которая может иметь ревизии, поля, переводы и т. Д.Я не могу сказать вам, какой из них более подходит для вашего случая использования, но я призываю вас подумать о том, какой из этих интерфейсов наиболее подходит для кода, который вы пишете.
Мой инстинкт подсказывает мне, что вы будете использовать
AccountInterface
что-то, что минимально «вошло в систему» (например, вошел в систему пользователь, список пользователей в сети, кто-то вошел через SSO) иUserInterface
для чего-то большего (например, профили пользователей, связанные авторы, длинные данные, большинство вещей, которые мы делаем в Drupal).источник