はじめに - 背景と前提条件(Drupal 8)
Drupal 8は、PHP言語の高度な機能と複雑なサードパーティライブラリを多数使用して、利用可能なすべてのCMSの中で最も先進的なAPIをサードパーティ開発者に提供します。Drupal 7の経験豊富な開発者はいくつかの大きな変更を見るかもしれませんが、基本構造の大部分は見慣れたままです。
D8モジュール開発者向けのステップバイステップガイドを進める際に提示された内容のいずれかが初めての場合は、以下の内容が役立ちます。ただし、D8モジュールの説明に進むために網羅的な知識は必要ありません。
オブジェクト指向プログラミング
OOPは、最初は威圧的に感じるかもしれませんが、現在では最良の方法として確立されています。
PHPのベストプラクティスの一般的な概要については、phptherightway.comをお読みください。Drupalはそこに文書化されているさまざまなツールや手法をすべて使用するわけではありませんが、PHPと言語の多くの機能への優れた入門書として機能します。
PHPのクラスとオブジェクトに関する公式ドキュメントと、次の優れたチュートリアルの一部を読んで、OOPの知識を更新してください:
- PHP OOP全効果
- オブジェクト指向プログラミング (ウィキペディア)
- 初心者のためのオブジェクト指向PHP (tuts+)
- オブジェクト指向の概念 (tutorialspoint.com)
- PHPでのオブジェクト指向プログラミング (phpro.org)
- PHPでのオブジェクト指向プログラミング (youtube.com)
- プログラミングの基礎:オブジェクト指向設計 (lynda.com)
- 知っておくべきPHPのOOP概念12選
- SymfonyCastsのOOPトラック (旧KNP university)
Drupal 8では、いくつかの一般的な設計パターンも使用されています。それらについて一般的な理解を持っておく必要があります:
ファクトリパターン および遅延静的束縛
ソフトウェア設計パターン(ウィキペディア)
プログラミングの基礎:設計パターン(lynda.com)
@todo: 使用しているパターンに関するドキュメントへのリンクを追加...
PHP名前空間
PHPの名前空間の概念に慣れていない場合は、次の記事を試してください:
- PHP名前空間の使用方法。
- PHP: 名前空間
- PHP名前空間に関するビデオ。
- PHP名前空間の説明 (Dayle Rees著)
- PHPでの名前空間 (tuts+)
ほとんどの場合、Drupalコードは、コードが属するモジュールに基づく名前空間です。
例:block.moduleの名前空間
namespace Drupal\block;
@todo: なぜ時々Drupal \で、時々Drupal \\ [Controller|Form|Plugin|など]なのか、そしてどちらを使用すべきかをどう判断するかを説明...
Drupalの名前空間標準の詳細をご覧ください。DrupalでのPSR-4の使用についてはこちらをご覧ください。正しく設定されたコードエディターは、PHP名前空間を認識し、ヘルプとオートコンプリートを提供できるはずです。
依存性注入
依存性注入は実際にはOOP設計パターンのもう1つですが、Drupal 8がこの概念を集中的に使用しており、主要なAPIの多くにアクセスして使用するには基本的な理解が重要であるため、ここで取り上げます。
PHPでの依存性注入と、そのページの追加記事をご覧ください。特にこの記事は、Drupalが参照されるSymfonyサービスコンテナを集中的に使用しているためです。
関連情報:
- Drupal 8のサービスと依存性注入
- 依存性注入 (ウィキペディア)
Symfony
Symfonyは、さまざまなPHPプロジェクトでのコード重複を減らすためにDrupalが採用したPHPフレームワークです。Drupal 8がルーティング、セッション、サービスコンテナの管理に使用するコードの大部分は、とりわけSymfony 2から借用されたものです(Drupal 8の開発が進むにつれてSymfony 3に移行しました)。この決定がなされた理由について詳しく知りたい場合は、主任コミッターのalexpottによるこのプレゼンテーションをご覧ください。
Symfony 2に関する書籍をチェックして、Symfonyの知識を更新してください。Drupalを理解するためにすべてが必要なわけではありませんが、Symfonyがどのように機能するかを知ることで、より優れたDrupal開発者であり、より優れたPHP開発者にもなれます。Symfony用語集にも興味があるかもしれません。
core/composer.lockをチェックして、Symfonyライブラリを確認してください。Drupal 8.6.15以降、これはSymfony PHPと密接に関連するライブラリです:
...
"symfony/class-loader": "~3.4.0",
"symfony/console": "~3.4.0",
"symfony/dependency-injection": "~3.4.26",
"symfony/event-dispatcher": "~3.4.0",
"symfony/http-foundation": "~3.4.26",
"symfony/http-kernel": "~3.4.14",
"symfony/routing": "~3.4.0",
"symfony/serializer": "~3.4.0",
"symfony/translation": "~3.4.0",
"symfony/validator": "~3.4.0",
"symfony/process": "~3.4.0",
"symfony/polyfill-iconv": "^1.0",
"symfony/yaml": "~3.4.5",
"twig/twig": "^1.38.2",
"doctrine/common": "^2.5",
"doctrine/annotations": "^1.2",
...
アノテーション
Drupal 8はPHPアノテーション(特殊な構文を使用してコードに追加される@docblockコメント)を使用して、プラグインを検出し、実行可能コードに追加のコンテキスト/メタデータを提供します。アノテーションはDoctrineアノテーションパーサー(v.1.6.)を使用して読み取られ、Drupalがコードの動作をよりよく理解するために使用できる情報に変換されます。
プラグイン検出のためのアノテーションの使用の詳細をご覧ください。
Drupal 8のさまざまな種類のアノテーションのリストをご覧ください。
関連情報:PHPDoc(ウィキペディア)
プラグイン
プラグインは、別のプラグインに簡単に置き換えられる方法で小さな機能を提供します。同様の機能を実行するプラグインは同じタイプに属します。例えば、「フィールドウィジェット」はプラグインのタイプであり、各フィールドウィジェット(テキストフィールド、テキストエリア、日付など)はプラグインとして実装されます。
Drupal 8のプラグインAPIの詳細をご覧ください。
サービス
Drupal 8では、サービスはサービスコンテナによって管理される任意のオブジェクトです。サービスという概念は、再利用可能な機能を分離するために導入され、これらのサービスを密接に関連する依存性注入サービスコンテナに登録することで、プラグ可能で置き換え可能にします。
その他のリソース
Drupal 8に慣れるのに役立つ追加リソースのリストを以下に示します。