Drupalにおけるエンティティとは何か

## 今回のプレゼンテーションについて

---
### 対象
- ユーザー、ノード、タームなどの用語が分かる
- オブジェクト指向プログラミングの「継承」「インスタンス化」などの概念が分かる
- Drupalのバックエンドについて知りたい

---

### 元になってる[ブログ](https://www.studio-umi.jp/blog/7/677)

<img width="833" alt="スクリーンショット 2019-01-10 13.18.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/253501/2ee57978-3b38-065d-eeb1-6a3c4713edc7.png">

---

## ソース

### 動画

- [What Are Drupal Entities? | Drupalize.Me](https://drupalize.me/videos/what-are-drupal-entities?p=1174)
- [DrupalCon New Orleans 2016: Entities 101 : Understanding Data Structures in Drupal - YouTube](https://www.youtube.com/watch?time_continue=1937&v=jJIOMRChBu4)
- [What's New in Drupal 8: Entity Field API | Drupalize.Me](https://drupalize.me/videos/whats-new-drupal-8-entity-field-api?p=2075)

### ドキュメント

- [An Introduction to Entities | Drupal 7 guide on Drupal.org](https://www.drupal.org/docs/7/api/entity-api/an-introduction-to-entities)
- [Entity API | entity.api.php | Drupal 8.5.x | Drupal API](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21entity.api.php/group/entity_api/8.5.x)
- [Standarized, pluggable entity loading (nodes, users, taxonomy, files, comments) [#460320] | Drupal.org](https://www.drupal.org/node/460320)

### & 会社の先輩達

---

## 開発者がエンティティを学ぶ意義
 
---

### これからはエンティティの時代！
- エンティティの概念はDrupal７で導入
- Drupal 8で完成（？）
- Drupal 8では全てのウェブコンテンツをエンティティ化することがベストプラクティスとされている
- Drupal 8のドキュメントはエンティティの知識なくしては読めない！
- エンティティシステムはこれからも進化・洗練されていくことが予想される

---

## なぜエンティティシステムが作られたのか

---

### 考えよう！「Drupalサイトで扱うデータにはどんな機能が求められるか？」

#### ユーザー
- id、名前、パスワード、メールアドレス、作成日、言語コードなどのデータを持つ
- ログイン情報や閲覧権限と結びつけることができる
- データベースに保存できる
- PHPで加工できる
- レンダリングできる

#### ノード（記事）
- id、タイトル、本文、作成日、言語コードなどのデータを持つ
- データベースに保存できる
- PHPで加工できる
- レンダリングできる

#### ターム
- id、ターム名、説明、作成日、言語コードなどのデータを持つ
- タームをクリックすると同じタームを持つコンテンツ一覧を表示する
- データベースに保存できる
- PHPで加工できる
- レンダリングできる

---

### それらの共通部分は？
- id、作成日、言語コードを持つ
- データベースに保存できる
- PHPで加工できる
- レンダリングできる

---

### Drupalist達は考えた 

かぶってる機能に必要なパラメーターとかメソッドを一つにまとめちゃったら便利なんじゃない？
↓
__エンティティシステム爆誕（Drupal 7）__

※イメージです

---

## で、エンティティって何よ(´･ω･`)

---

### エンティティシステムとは
- Drupalサイトの__ありとあらゆるデータ__を__規格化__し、__統一された方法__で処理できるようにする仕組み
- サイトのパフォーマンスアップ・開発効率アップが主な目的

---

### 「ありとあらゆるデータ」って？
- ユーザー、ノード、タームなどのウェブコンテンツ
- 構成（コンフィギュレーション）

---

### エンティティとは
__単一__のデータをエンティティシステムに適合するように加工した__PHPオブジェクト__

- __一人__のユーザー
- __一本__のノード（記事）
- __一つ__のターム

---

## 例（ノード）

---

###　表の顔
<img width="768" alt="スクリーンショット 2019-01-11 13.29.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/253501/cd76e8ec-1523-4994-defe-fe2857f63bed.png">

---

### 裏の顔
※　Develモジュールを使った確認方法方法

- Develモジュールインストール
- ノードの画面でDevelタブクリック

<img width="774" alt="スクリーンショット 2019-01-11 13.31.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/253501/75d3f12d-e0a2-fca6-2d63-4c00d04347cc.png">

- LoadタブのVariableをクリック

<img width="1431" alt="スクリーンショット 2019-01-11 13.31.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/253501/4e82f191-62fc-5315-8099-9526385f3f37.png">

__表向きはシンプルでも、裏に大量のパラメーターとメソッドを隠し持っている！！__

---

##　エンティティの大量のパラメータとメソッドはどこから来たのか

---

### エンティティはこう作られる

#### エンティティクラス
[Entity | Entity.php | Drupal 8.2.x | Drupal API](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21Entity.php/class/Entity/8.2.x)
 
↓継承

#### エンティティベースクラス
[ContentEntityBase | ContentEntityBase.php | Drupal 8.2.x | Drupal API](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21ContentEntityBase.php/class/ContentEntityBase/8.2.x)

↓継承

#### ノードクラス
[Node | Node.php | Drupal 8.2.x | Drupal API](https://api.drupal.org/api/drupal/core!modules!node!src!Entity!Node.php/class/Node/8.2.x)

↓インスタンス化

#### ノードエンティティ
<img width="768" alt="スクリーンショット 2019-01-11 13.29.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/253501/cd76e8ec-1523-4994-defe-fe2857f63bed.png">

__大量のパラメーターとメソッドは親クラスから引き継がれたもの__

---

### 図にまとめると・・・
<img width="663" alt="スクリーンショット 2019-01-11 16.19.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/253501/4dcf6720-9ead-fa1e-fbe6-237ee32bbb5f.png">

---

##　(最後に)エンティティシステムを使いこなせるとこんなに便利

---

### エンティティのメソッドを使えると・・・

- 全エンティティ共通のパラメーターやメソッド使って簡単にデータにアクセスできる
- どんなデータもEntityManagerを通じて操作できる
- エンティティ間で「連鎖」が可能(とある記事の著者IDからそのIDのユーザープロフィールにアクセスする、など)

```php5
//　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の多言語機能に対応できる

---

## みなさんもよいエンティティライフを！