Тип подсказки - что лучше, UserInterface или AccountInterface?

8

Недавно я наконец начал смещать фокус с D7 на D8, и я перевожу сайт на D8. В D7 я указывал на объекты своей учетной записи как \ stdClass, так как они не были членами какого-либо класса. Однако в D8 они теперь являются членами класса User.

Тем не менее, я нахожу в некотором коде в сети, что люди печатают как Drupal \ Core \ Session \ AccountInterface, а в других местах как Drupal \ user \ UserInterface. Как мы должны определить, какой из них использовать для наших шрифтов, и в чем разница между двумя типами объектов?

Jaypan
источник
Я думаю, что оба ответа здесь приличные (и я проголосовал за них обоих, а также за вопрос), но я думаю, что оба могли бы лучше объяснить разницу между AccountInterface и UserInterface. Другими словами, почему у нас есть один (и классы реализуют его) в \ Drupal \ Core \ Session, а другой в его собственном модуле \ Drupal \ user. Механика объясняется, но не почему (что важно, чтобы действительно понять различия).
mpdonadio

Ответы:

6

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().

  $user = \Drupal::currentUser();

  \Drupal::logger('user')->notice('Session closed for %name.', array('%name' => $user->getAccountName()));

  \Drupal::moduleHandler()->invokeAll('user_logout', array($user));

Иногда документация для ловушки не показывает конкретную подсказку, например, в случае hook_user_login(). В этом случае это может помочь увидеть, какая подсказка используется, например system_user_login(), из реализаций этой ловушки , которая использует UserInterfaceкак подсказку для своего аргумента.

Если вы не уверены в правильности интерфейса, реализуемого объектом, передаваемым функции (включая хук), используйте в качестве подсказки наиболее общий. В случае, если вы опишите, это будет AccountInterface.

киамлалуно
источник
4

Как пользовательский интерфейс расширяет AccountInterface типа настройки намек на AccountInterface позволит вам принять оба типа объектов. Вы можете думать о UserInterface как о расширенном AccountInterface, который объявляет несколько дополнительных методов ( hasRole , addRole , removeRole и т. Д.). Я бы использовал интерфейс AccountInterface везде, где это возможно, если вам не нужны некоторые из этих дополнительных методов.

Еще одна деталь, объект UserInterface также должен реализовывать методы из ContentEntityInterface и EntityChangedInterface .

ya.teck
источник
2

Проверьте документацию для AccountInterface:

Определяет объект, который имеет идентификатор пользователя, роли и может иметь данные сеанса. Интерфейс реализован как глобальным сеансом, так и пользовательским объектом.

Он находится в Sessionпространстве имен по причине - он представляет собой нечто, что может иметь данные сеанса.

В ContentEntityInterfaceи EntityChangedInterfaceинтерфейсах распространяемых UserInterfaceвам сказать , что он представляет другую концепцию:

Контентные сущности используют поля для всех своих свойств сущностей и являются переводимыми и редактируемыми, в то время как переводы и редакции могут быть включены для каждого типа сущности.

Определяет интерфейс для отслеживания метки времени изменения объекта.

Эти данные могут быть полезны для более точной аннулирования кэша (особенно на стороне клиента) и одновременной блокировки редактирования.

A UserInterfaceпредставляет собой полную учетную запись пользователя Drupal, которая может иметь ревизии, поля, переводы и т. Д.


Я не могу сказать вам, какой из них более подходит для вашего случая использования, но я призываю вас подумать о том, какой из этих интерфейсов наиболее подходит для кода, который вы пишете.

Мой инстинкт подсказывает мне, что вы будете использовать AccountInterfaceчто-то, что минимально «вошло в систему» ​​(например, вошел в систему пользователь, список пользователей в сети, кто-то вошел через SSO) и UserInterfaceдля чего-то большего (например, профили пользователей, связанные авторы, длинные данные, большинство вещей, которые мы делаем в Drupal).

Алекс Барретт
источник