Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Webアプリケーションフレームワークとしての Drupalの可能性

449 views

Published on

Developers Festa Sapporo 2018のスライドです。
https://www.devfesta.jp/

Published in: Internet
  • Be the first to comment

  • Be the first to like this

Webアプリケーションフレームワークとしての Drupalの可能性

  1. 1. Webアプリケーションフレームワークとしての Drupalの可能性 Nov 16th 2018 / Developers Festa Sapporo 2018 ANNAI Inc. CTO Yoshikazu Aoyama
  2. 2. about me 青山 義万(あおやま よしかず) ANNAI Inc CTO Drupal Japan User Group Drupalさっぽろ Twitter: @blauerberg
  3. 3. 3 ● Founded in 2007 ● Started with Drupal 5 ● HQ in Kyoto, Japan ● Team of 6 people working remotely is a Drupal development agency
  4. 4. Drupalとは • PHPで実装されたオープンソースのCMS • Initial release: May 18 2000 (18 years ago) • drupal.org 上で開発やコミュニティ活動が行われ ている https://en.wikipedia.org/wiki/Drupal
  5. 5. https://www.drupal.org/ drupal.org
  6. 6. • 47,736 people with Git accounts • 1,780 Git commits this week • 1,360,212 users on drupal.org • 1,153,239 sites running Drupal • 7,473,937 comments and issue followups https://www.drupal.org/getting-involved drupal.org
  7. 7. drupal.org • 非常に大きなコミュニティで開発も活発 • コアだけなくモジュール(プラグイン)も含めた開 発情報が全てdrupal.orgで管理されている • コアだけではなくモジュールも含め、専属のセ キュリティチームによりセキュリティ更新を提 供している
  8. 8. drupal.org Drupalコアだけでなく、全モジュールのバ グや開発情報が一元管理されている
  9. 9. Drupalの特徴 • 多数のモジュールによる拡張性の高さ? • 多言語対応? • セキュリティ? • エンタープライズ向け?
  10. 10. Drupalの特徴 https://www.drupal.com/product/web-content-management
  11. 11. https://www.drupal.com/product/web-content-management Drupalの特徴
  12. 12. Flexible Content Architecture Create the right content architecture using the Admin Interface or do it programatically. 要するに… システムで管理するモデルを「コードで定義」す るだけでなく「管理UIから定義」(自動生成)するこ ともできる。
  13. 13. Drupalを使ってシンプルなWeb アプリを実際に作ってみる • モデルの定義とCRUD機能の実装 • 検索機能付きのモデルの一覧の実装 • REST API
  14. 14. Drupalの始め方
  15. 15. 最低限必要なもの php composer SQLite
  16. 16. Drupalで新しいプロジェクトを 作成して立ち上げる $ composer create-project drupal-composer/drupal-project:8.x-dev my_drupal_project --stability dev --no-interaction $ cd my_drupal_project $ vendor/bin/drupal site:install standard --db-type="sqlite" --no-interaction $ vendor/bin/drupal server $ open http://127.0.0.1:8088/ https://github.com/drupal-composer/drupal-project
  17. 17. Hello Drupal!
  18. 18. モデルの定義と CRUD機能の実装
  19. 19. Entity Drupalで管理するデータの基本クラス https://www.drupal.org/docs/8/api/entity-api
  20. 20. Drupal内のほぼ全てのデータは Entity https://www.drupal.org/files/classDrupal_Entities.png Entity
  21. 21. ベースとなる2種類のEntity • ContentEntity (ContentEntityBase) モデルのデータを管理するためのEntity • ConfigurationEntity (ConfigEntityBase) システムの設定情報を管理するためのEntity
  22. 22. 独自のモデルを作成するため のステップ 1. カスタムモジュールを作成する 2. ContentEntityBaseのサブクラスを作る 3. baseFieldDefinitionsメソッドでモデルのフィー ルドを定義する
  23. 23. カスタムモジュールを作成する 自動生成 (scaffolding) できます。 $ vendor/bin/drupal generate:module --module="my_custom_module" https://www.drupal.org/docs/8/creating-custom-modules/let-drupal-8-know-about-your-module-with-an-infoyml-file
  24. 24. ContentEntityBaseの サブクラスを作る 自動生成 (scaffolding) できます。 $ vendor/bin/drupal generate:entity:content --module="my_custom_module” -- entity-class="BookEntity"
  25. 25. ContentEntityBaseの サブクラスを作る Scaffoldingで自動生成されたbook entity
  26. 26. Entityの派生クラスのnamespaceを Drupal{module_name}Entity にすることで、 独自のEntityがフレームワークに自動検出され、 様々な機能をコードの実装や設定をせずに利用できる ようになる。 ContentEntityBaseの サブクラスを作る
  27. 27. baseFieldDefinitionsメソッドで モデルのフィールドを定義する public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { $fields = parent::baseFieldDefinitions($entity_type); // (snip) $fields['isbn'] = BaseFieldDefinition::create('string’) ->setLabel(t('ISBN’)) ->setDisplayConfigurable('form', TRUE) ->setDisplayConfigurable('view', TRUE); https://www.drupal.org/docs/8/api/entity-api/defining-and-using-content-entity-field-definitions
  28. 28. baseFieldDefinitionsメソッドで モデルのフィールドを定義する baseFieldDefinitionsメソッドで追加したフィールド
  29. 29. baseFieldDefinitionsメソッドで モデルのフィールドを定義する baseFieldDefinitionsメソッドの実装とデータベースの スキーマを同期する。 $ vendor/bin/drush -y entity:updates --cache-clear
  30. 30. コードを書かずに管理UIから モデルのフィールドを定義する
  31. 31. コードを書かずに管理UIから モデルのフィールドを定義する
  32. 32. コードを書かずに管理UIから モデルのフィールドを定義する 管理UIから追加したフィールド
  33. 33. CRUD機能のコード https://www.drupal.org/files/classDrupal_Entities.png save(), load(), delete() preSave(), postLoad()などの インターフェース定義 save(), load(), delete()などの実装 必要に応じてpreSave(), postLoad() などを実装
  34. 34. コード実装 vs 管理UIでの定義 • どちらもできることは変わらない • 併用できる • ホットモックやPoCを作る際は管理UIで定義すると 素早く作り込むことができる • 管理UIで定義した内容はConfigurationEntityとして ymlフォーマットでコード化することも可能
  35. 35. 検索機能付きのモデルの 一覧の実装
  36. 36. よくある実装例 コントローラーのindexメソッドでデータのコレク ションを取得し、データをテンプレートに渡して 一覧でリスト表示する。
  37. 37. Drupalの場合 「Views」で管理UIから全てを自動生成することが できる。
  38. 38. Viewsとは • 管理UIからデータの抽出条件や出力フォーマッ トを指定し、Drupal内のデータを取得・出力す るモジュール
  39. 39. Viewsの典型的なユースケース (ユーザーの一覧) ユーザー(UserEntity)の一覧と検索フォーム
  40. 40. Viewsを使いモデルの一覧を 自動生成する
  41. 41. Viewsを使いモデルの一覧を 自動生成する 出力フォーマット 出力するデータ フィルター条件
  42. 42. Viewsを使いモデルの一覧を 自動生成する
  43. 43. 独自のモデルで Viewsの機能を使うには EntityViewsData のサブクラスを実装する。 モデルのクラスがContentEntityBaseのサブクラ スの場合は、サブクラス側で特に追加で実装し なければならないロジックはない。
  44. 44. EntityViewsData namespace Drupalmy_custom_moduleEntity; use DrupalviewsEntityViewsData; class BookEntityViewsData extends EntityViewsData { public function getViewsData() { $data = parent::getViewsData(); // Additional information for Views integration, // such as table joins, can be put here. return $data; } }
  45. 45. Viewsでできること • 典型的なユースケースとしては「検索機能付き の一覧」の作成 • コードを書かずに全てを管理UIから自動生成で きる • モデルの定義の変更も自動的に認識する • 複数のモデルを結合して取り出すことも可能
  46. 46. REST API
  47. 47. REST APIを提供する2つの方法 • 1. RESTful Web Service モジュール • 2. JSON API モジュール
  48. 48. RESTful Web Service • Drupal 8.0からコアに含まれているモジュール • APIの定義自体の変更はできない
  49. 49. RESTful Web Service
  50. 50. JSON API • Drupal 8.7からコアに入る予定 • APIの定義自体を管理UIから変更できる(with JSON API Extras) • 今後はこちらが主流になると思われる
  51. 51. JSON APIでできること • APIの有効化・無効化 • エンドポイントURLの変更 • モデルの各プロパティのフィルタ • プロパティのキー変換 (Alias) • プロパティの値の変換 (Enhancer) • OpenAPI Spec準拠のドキュメント生成
  52. 52. JSON API (管理UI)
  53. 53. JSON API (管理UI)
  54. 54. 独自のモデルで JSON APIを使う モデルをContentEntityBaseのサブクラスとして 定義すれば、JSON API向けにインターフェース 等を追加で実装する必要はない。
  55. 55. 独自のエンティティで JSON APIを使う
  56. 56. OpenAPI準拠の APIドキュメントの自動生成が可能
  57. 57. Thank you!

×