类型提示-UserInterface或AccountInterface哪个更好?


8

最近,我终于开始将注意力从D7转移到D8,并将网站转换为D8。在D7中,我将帐户对象键入\ stdClass,因为它们不是任何类的成员。但是,在D8中,它们现在是User类的成员。

就是说,我在网上的某些代码中发现人们在键入提示,例如Drupal \ Core \ Session \ AccountInterface,在其他地方则键入了Drupal \ user \ UserInterface。我们应该如何确定要使用哪种类型的类型提示,两种对象之间的区别是什么?


我认为这里的两个答案都不错(我同时对问题和答案都表示赞同),但是我认为两个答案都可以更好地解释AccountInterface和UserInterface之间的区别。换句话说,为什么在\ Drupal \ Core \ Session中有一个(并对其实施类),而在自己的模块\ Drupal \ user中又有一个。解释了机制,但没有解释原因(这对于真正理解差异很重要)。
mpdonadio

Answers:


6

UserInterface延伸ContentEntityInterfaceEntityChangedInterfaceAccountInterface。这意味着实现对象的对象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

随着UserInterface扩展AccountInterface设置类型提示到AccountInterface,您将可以接受两种类型的对象。您可以将UserInterface视为高级AccountInterface,它声明一些其他方法(hasRoleaddRoleremoveRole等)。我将尽可能使用AccountInterface接口,除非您需要其中一些额外的方法。

还有一个细节,UserInterface的对象也应该实现ContentEntityInterfaceEntityChangedInterface中的方法。


2

检查文档AccountInterface

定义一个具有用户ID,角色并且可以具有会话数据的对象。该接口由全局会话和用户实体共同实现

Session之所以在名称空间中是有原因的-它表示可以包含会话数据的内容。

ContentEntityInterfaceEntityChangedInterface接口扩展的UserInterface告诉你,它代表一个不同的概念:

内容实体将字段用于其所有实体属性,并且可以翻译和修订,而可以按实体类型启用翻译和修订。

定义用于实体更改时间戳跟踪的接口。

此数据对于更精确的缓存无效化(尤其是在客户端)和并发编辑锁定很有用。

A UserInterface代表完整的Drupal用户帐户,其中可以包含修订,字段,翻译等。


我无法告诉您哪个更适合您的用例,但我鼓励您考虑以下哪个接口最适合您正在编写的代码。

我的直觉告诉我,您将使用AccountInterface最少“已登录”的内容(例如,登录用户,在线用户列表,通过SSO登录的人)以及除此以外UserInterface的其他内容(例如,用户个人资料,关联的作者,实时数据,这是我们在Drupal中所做的大多数事情)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.