タイプヒント-UserInterfaceとAccountInterfaceのどちらが優れていますか?


8

最近、ようやく焦点をD7からD8に移し始め、サイトをD8に変換しています。D7では、アカウントオブジェクトはクラスのメンバーではなかったため、\ stdClassとしてタイプヒンティングしました。ただし、D8では、それらは現在Userクラスのメンバーです。

とは言っても、ネット上のいくつかのコードで、人々がDrupal \ Core \ Session \ AccountInterfaceとしてタイプヒンティングしていること、他の場所ではDrupal \ user \ UserInterfaceとしてタイプヒンティングしていることがわかりました。タイプヒントに使用するものをどのように決定する必要がありますか。また、2つのタイプのオブジェクトの違いは何ですか。


ここでの回答はどちらもまともです(そして私は両方と質問に賛成票を投じました)が、どちらもAccountInterfaceとUserInterfaceの違いを説明するより良い仕事をすることができると思います。言い換えると、なぜ\ Drupal \ Core \ Sessionに1つ(そしてそれを実装するクラス)を持ち、独自のモジュール\ Drupal \ userにもう1つあるのですか?メカニズムは説明されていますが、理由は説明されていません(違いを本当に理解するために重要です)。
mpdonadio

回答:


6

UserInterface拡張ContentEntityInterfaceEntityChangedInterfaceAccountInterface。つまり、実装するオブジェクトにUserInterface必要なメソッドはありますが、実装するオブジェクトに必要AccountInterfaceはありません。たとえば、ありますUserInterface::hasRole()AccountInterface::getRoles()、最初のケースでは、オブジェクトが特定の役割を持っていることを確認できるヘルパーメソッドがありますが、2番目のケースでは、そのためのコードを記述して、で役割のリストを取得する必要があります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は、いくつかの追加メソッド(hasRoleaddRoleremoveRoleなど)を宣言する高度なAccountInterfaceと考えることができます。これらの追加メソッドが必要でない限り、可能な限りAccountInterfaceインターフェイスを使用します。

さらに詳細には、UserInterfaceのオブジェクトは、ContentEntityInterfaceおよびEntityChangedInterfaceからのメソッドも実装する必要があります。


2

ドキュメントを確認してくださいAccountInterface

ユーザーIDとロールを持ち、セッションデータを持つことができるオブジェクトを定義します。インターフェイスは、グローバルセッションとユーザーエンティティの両方によって実装されます

それは中だSession理由の名前空間-それはセッションデータを持つことができる何かを表しています。

拡張されたインタフェース:それは別の概念を表していることを教えてくれContentEntityInterfaceEntityChangedInterfaceUserInterface

コンテンツエンティティは、すべてのエンティティプロパティのフィールドを使用し、翻訳および修正が可能ですが、翻訳および修正はエンティティタイプごとに有効にすることができます。

エンティティ変更タイムスタンプトラッキングのインターフェースを定義します。

このデータは、より正確なキャッシュの無効化(特にクライアント側)と同時編集ロックに役立ちます。

A UserInterfaceは、リビジョン、フィールド、翻訳などを持つことができる完全なDrupalユーザーアカウントを表します。


どちらがあなたのユースケースに適しているかはわかりませんが、あなたが書いているコードにこれらのインターフェースのどれが最も適しているかについて考えることをお勧めします。

私の直感AccountInterfaceでは、最小限の「ログイン」されたもの(たとえば、ログインしたユーザー、オンラインのユーザーのリスト、SSOを介してサインインしたユーザー)とUserInterfaceそれ以上のもの(たとえば、ユーザープロファイル、関連付けられた作成者、長い-存続データ、私たちがDrupalで行うほとんどのこと)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.