今回のプレゼンテーションについて
対象
- ユーザー、ノード、タームなどの用語が分かる
- オブジェクト指向プログラミングの「継承」「インスタンス化」などの概念が分かる
- Drupalのバックエンドについて知りたい
元になってるブログ
ソース
動画
- What Are Drupal Entities? | Drupalize.Me
- DrupalCon New Orleans 2016: Entities 101 : Understanding Data Structures in Drupal - YouTube
- What's New in Drupal 8: Entity Field API | Drupalize.Me
ドキュメント
- An Introduction to Entities | Drupal 7 guide on Drupal.org
- Entity API | entity.api.php | Drupal 8.5.x | Drupal API
- Standarized, pluggable entity loading (nodes, users, taxonomy, files, comments) [#460320] | Drupal.org
& 会社の先輩達
開発者がエンティティを学ぶ意義
これからはエンティティの時代!
- エンティティの概念はDrupal7で導入
- Drupal 8で完成(?)
- Drupal 8では全てのウェブコンテンツをエンティティ化することがベストプラクティスとされている
- Drupal 8のドキュメントはエンティティの知識なくしては読めない!
- エンティティシステムはこれからも進化・洗練されていくことが予想される
なぜエンティティシステムが作られたのか
考えよう!「Drupalサイトで扱うデータにはどんな機能が求められるか?」
ユーザー
- id、名前、パスワード、メールアドレス、作成日、言語コードなどのデータを持つ
- ログイン情報や閲覧権限と結びつけることができる
- データベースに保存できる
- PHPで加工できる
- レンダリングできる
ノード(記事)
- id、タイトル、本文、作成日、言語コードなどのデータを持つ
- データベースに保存できる
- PHPで加工できる
- レンダリングできる
ターム
- id、ターム名、説明、作成日、言語コードなどのデータを持つ
- タームをクリックすると同じタームを持つコンテンツ一覧を表示する
- データベースに保存できる
- PHPで加工できる
- レンダリングできる
それらの共通部分は?
- id、作成日、言語コードを持つ
- データベースに保存できる
- PHPで加工できる
- レンダリングできる
Drupalist達は考えた
かぶってる機能に必要なパラメーターとかメソッドを一つにまとめちゃったら便利なんじゃない?
↓
エンティティシステム爆誕(Drupal 7)
※イメージです
で、エンティティって何よ(´・ω・`)
エンティティシステムとは
- Drupalサイトのありとあらゆるデータを規格化し、統一された方法で処理できるようにする仕組み
- サイトのパフォーマンスアップ・開発効率アップが主な目的
「ありとあらゆるデータ」って?
- ユーザー、ノード、タームなどのウェブコンテンツ
- 構成(コンフィギュレーション)
エンティティとは
単一のデータをエンティティシステムに適合するように加工したPHPオブジェクト
- 一人のユーザー
- 一本のノード(記事)
- 一つのターム
例(ノード)
表の顔
裏の顔
※ Develモジュールを使った確認方法方法
- Develモジュールインストール
- ノードの画面でDevelタブクリック
- LoadタブのVariableをクリック
表向きはシンプルでも、裏に大量のパラメーターとメソッドを隠し持っている!!
エンティティの大量のパラメータとメソッドはどこから来たのか
エンティティはこう作られる
エンティティクラス
Entity | Entity.php | Drupal 8.2.x | Drupal API
↓継承
エンティティベースクラス
ContentEntityBase | ContentEntityBase.php | Drupal 8.2.x | Drupal API
↓継承
ノードクラス
Node | Node.php | Drupal 8.2.x | Drupal API
↓インスタンス化
ノードエンティティ
大量のパラメーターとメソッドは親クラスから引き継がれたもの
図にまとめると・・・
(最後に)エンティティシステムを使いこなせるとこんなに便利
エンティティのメソッドを使えると・・・
- 全エンティティ共通のパラメーターやメソッド使って簡単にデータにアクセスできる
- どんなデータもEntityManagerを通じて操作できる
- エンティティ間で「連鎖」が可能(とある記事の著者IDからそのIDのユーザープロフィールにアクセスする、など)
// IDが1のノードの著者の名前を取得する
$node = \Drupal\node\Entity\Node::load(1); //ノードIDが1のノードエンティティを取得
$user = $node->getOwnerId(); //ノードの著者のユーザーエンティティを取得
$author_name = $user->getUserName(); //ユーザーエンティティが持つユーザー名を取得
//連鎖した書き方
$author_name = \Drupal\node\Entity\Node::load(1)->getOwnerId->getUserName();
カスタムのエンティティタイプを作成できると・・・
- 複雑なデータ構造のウェブコンテンツを簡単に実装できる
- コードを書かずにViews、Token、RESTなどとのインテグレーションを使える
- コードを書かずにDrupalの多言語機能に対応できる