DIARY :: AROUND THE CORNER :: 20140630003
翻訳「Drupal 8: Hello OOP, Hello world!」:補足 2

DIARY :: AROUND THE CORNER :: 20140630003

当ページでは、当方による翻訳『翻訳「Drupal 8: Hello OOP, Hello world!」』に関して、オリジナルの原文公開時以降の規約変更とそれに伴い必要となる原文・翻訳文の読み替えについての補足説明(詳細)を行っています。
PHP 関連の開発コミュニティに実際に参加されていたり情報収集していらっしゃる方には既にご承知のことと思われますが、PHP FIG(PHP Framework Interoperability Group)において、これまでの PHP の Autoloading 関連の規約である「PSR-0」に追加される規約として「PSR-4」が承認されました。「PSR-4」が承認される以前に、Drupal 8 の規約が「PSR-0」準拠であった時期に書かれた effulgentsia 氏 の原文 「Drupal 8: Hello OOP, Hello world!」 において、この点に最も直接的に関連する記述(翻訳文)は、以下になります。
ディレクトリパスの一部分である「Drupal/hello」は、「PSR-0」に従う必要があります。「PSR-0」とは、完全なクラス名はファイルシステム上で表されなければならないとする規約です。これは少々やっかいな規約であり、それに対して責任を有する PHP の標準化グループは、これを要求しないような新しい規約を作るべく検討しているところです。彼らが他の規約を受け入れるよりも新しい規約を作ることを優先するならば、それは「PSR-4」と命名されるはずです。現在、「PSR-4」となるであろう望ましいルールへと転換することが、Drupal core にとっての課題の 1 つとなっています。そしてそれが実現したならば、喜ぶべきことに、Drupal 8 のモジュールの中でより浅いディレクトリパスが使用可能になることでしょう。
もちろん、この記述中の「それに対して責任を有する PHP の標準化グループ」とは、上記 PHP FIG のことです。 このように、原文は、「PSR-0」に準拠した Drupal 8 の規約に基づく記述となっていますが、「PSR-4」が承認となり、Drupal 8 の規約も「PSR-4」準拠とされたことに伴い、「PSR-0」に準拠した記述部分、すなわち「class ファイルの配置(モジュールのディレクトリ構造)」についての具体的記述は現状にそぐわなくなってしまっています。そこで、以下では、原文および翻訳文をお読みいただくための前提として、第 1 に、これらの変更点に関する予備知識について、第 2 に、その変更に伴い必要となる原文・翻訳文の読み替えについて、順に説明していきます。まず、「PSR」という規約を策定している「PHP FIG」とは、「PHP Framework Interoperability Group」という名称の通り(「PHP Framework Interop Group」という表記も見られますが)、Drupal も含め、PEAR、Zend Framework 2、Symfony2、CakePHP、Joomla などの PHP における主要なフレームワークやライブラリの開発組織・開発コミュ二ティがメンバーとなり、コードの相互利用を目指し準拠すべき共通の規約・ガイドラインなどを検討している団体です。2009 年に 5 つの団体により始められ、現在ではコアメンバー(投票権を有する)は 20 団体以上となっています。そして、「PSR」とは(「PHP Standards Recommendation」としているページもありますが)、PHP FIG 自体の github ページ によると「Proposing a Standards Recommendation」となっています。PHP FIG においては、これまで、「PSR-0(Autoloading Standard)」(infiniteloop さんによる翻訳hanawa さんによる翻訳)「PSR-1(Basic Coding Standard)」(infiniteloop さんによる翻訳)「PSR-2(Coding Style Guide)」(infiniteloop さんによる翻訳)「PSR-3(Logger Interface)」という 4 つの規約・ガイドラインが合意形成(承認)されてきました。そして、今回、PHP の Autoloading 関連の規約である「PSR-0」における問題点を解消するために、「PSR-0」に追加されるもの(置き換えるものでなく)として合意されたのが「PRS-4(Inploved Autoloading)」というわけです。「PSR-0」「PSR-4」の詳細については上記リンクなどを参照していただくとして、ここでは、原文・翻訳文の理解においてのみ重要となる事項について、次のようにまとめておきます。まず、「PSR-0」には、次のような規定があります。
「名前空間の区切り(バックスラッシュ)」は「ディレクトリの区切り」に変換される。
この点から、「PSR-0」では、具体的には、原文著者が記述しているように、次のような要請があることになります。
「PSR-0」では、「完全なクラス名はファイルシステム上で表現されなければならない」。
ここでの記述において「完全なクラス名(原文では「complete class name」となっています)」とは、正確には、プログラミングの専門用語における「完全修飾クラス名(fully qualified class name)」のことであり、原文(翻訳文)においては、具体的には、「\Drupal\hello\Controller\HelloController」という表記のことです。そして、これを「PSR-0」準拠でファイルシステム上に展開すると(ファイル単体の名称は「クラス名.php」とする必要があるため)、
ファイルパスは「Drupal/hello/Controller/HelloController.php」で終端する。
そして、Drupal 8 では、これを各モジュールの「lib」ディレクトリ以下に展開するという規約であったため、
ファイルパスは「lib/Drupal/hello/Controller/HelloController.php」で終端する。従って、Drupal 8 のトップディレクトリからの相対パスは、「modules/hello/lib/Drupal/hello/Controller/HelloController.php」となる。
となります。一方、「PSR-4」には、このような規定はありません。その代わりに、次のような規定があります(わかりやすさを優先し、丸めた表現にしています)。
(1)完全なクラス名のうち(先頭の「\」を除き)、トップレベルの namespace から任意のレベルの namespace 部分まで(=「namespace prefix」)を特定のディレクトリ(=「base directory」)に対応させることができる。(2)ただし、「namespace prefix」より後から「クラス名」の手前までの namespace 部分は、「base directory」の下位ディレクトリとして、「名前空間の区切り(バックスラッシュ)」を「ディレクトリの区切り」に変換し、対応付けされる。
すなわち、「PSR-4」では、原文著者の上記表現に対比させると、概ね、次のような要請があることになります。
「PSR-4」では、完全なクラス名の「namespace prefix」部分は、ある特定のディレクトリに対応させることができるが、「namespace prefix」部分より後の部分は、ファイルシステム上で表現されなければならない。
具体的に、これを「PSR-4」準拠でファイルシステム上に展開すると(ファイル単体の名称は「クラス名.php」とする必要があるため)、
「Drupal\hello」を「namespace prefix」とすると、ファイルパスは「Controller/HelloController.php」で終端する。「base directory」は、Drupal 8 においては、「modules/YOUR_MODULE_NAME/src」であり、従って、Drupal 8 のトップディレクトリからの相対パスは、「modules/hello/src/Controller/HelloController.php」となる。
となります。ということで、結局、「PSR-4」準拠では、「namespace prefix」に該当する部分を「base directory」に対応させることができる分だけ、「PSR-0」準拠に対してより浅いディレクトリパス(ファイルパス)でのファイル配置が可能になっています。翻訳させていただいた effulgentsia 氏の原文は、2013 年 8 月 2 日の公開です。この時点では、原文内でも言及されているように、「PSR-4」はまだ検討段階にあり、従って Drupal 8 も「PSR-0」に準拠していました。その後、2013 年 12 月 3 日に、上記のように「PSR-4」が承認となり、それを受けて、現時点においては Drupal 8 も「PSR-4」に準拠するようになっています。以上が、原文(翻訳文)の一部が現状にそぐわなくなってしまった経緯です。これらを踏まえて、以下に、具体的に読み替えを行うための考え方について説明致します。まず最初に、各モジュールの「class ファイル」は、「PRS-4」準拠となった現時点での Drupal 8 の規約においては、次の原則に従います。
モジュールのトップディレクトリに配置した「src」ディレクトリ以下に配置する。(Drupal のトップディレクトリからは「modules/MY_MODULE_NAME/src」となります)
今から新しいモジュールを開発するということであれば、最初から上記のように配置することになります。次に、「PSR-0」準拠から「PSR-4」準拠への変更に際しては、次の原則に従います。
(1)この変更は、コードの中の「namespace(名前空間)」「use statement(use 宣言)」には影響を与えない。  従って、(Drupal の Autoloading を利用している場合には)プログラムコードを変更する必要はない。(2)この変更は、「class ファイルの配置」にのみ影響を与える。
ということで、原文のサンプルコードにおいては「use statement」は登場しませんので、「class ファイルの配置」に関する具体的指定についてのみ読み替える必要があることになります。原文・翻訳文では、上記のように、次のような namespace を伴った class を例としています。
<?phpnamespace Drupal\hello\Controller;class HelloController { // some codes} 
それに対して、原文・翻訳文のように、「PSR-0」対応の「class ファイルの配置」(過去)は、次のようになっています。
lib/Drupal/hello/Controller/HelloController.php(Drupal のトップディレクトリからは「modules/hello/lib/Drupal/hello/Controller/HelloController.php」となります)
一方、「PSR-4」対応の「class ファイルの配置」(現在)は、「Drupal\hello」が「namespace prefix」とされ、「Controller」以降が「src」以下に展開されることから、次のようになります。
src/Controller/HelloController.php(Drupal のトップディレクトリからは「modules/hello/src/Controller/HelloController.php」となります)
要するに、
原文・翻訳文においては、「class ファイルの配置」に関してのみ、「lib/Drupal/hello/」の部分を「src/」と読み替えることが必要となる
ということです。原文著者も本文中で指摘していますが、「PSR-0」での問題点は、この例で考えると、「Drupal」の世界の中で「hello」という構成要素(モジュール)の一意性が既に確保されているにもかかわらず、その class ファイルを配置するためにさらに「Drupal/hello/」というディレクトリ階層が要求されるという冗長性でした。これは、Drupal に限らず、「PSR-0」に準拠する各 PHP フレームワークが共通的に抱える問題点であったと思われますが、それが「PSR-4」で解決され、現時点では、原文著者が本文中で希望しているようにより浅いディレクトリ構造でのファイル配置が実現しています。ただし、公平性のために追加しておきますと、考え方や立場などにより、「PSR-0」を支持する開発者と「PSR-4」を支持する開発者に分かれており、Drupal の内外に関わらず、必ずしも全ての開発者が「PSR-4」を歓迎しているというわけではないようです。原文著者は当然後者で、その理由は「冗長性を排したより浅いディレクトリ構造となる」からということですが、その一方で、「PSR-0」が確保してきた「namespace と ディレクトリパスとの相同性」という大原則が崩れることになります。つまり、「PSR-0」においては、たとえ冗長ではあったとしても、個別のライブラリやフレームワークに関わらず一律にその原則を適用できるという単純性が利点であるというわけです。複雑性を導入して冗長性を排するか、冗長性を残して単純性を確保するか、各コミュニティにとっては悩ましい選択であるようです。最後に、当ページ冒頭に掲載した原文の記述(赤字部分)に対して、仮に、現在、原文著者が追記するとしたら次のようになるであろう記述を掲載しておきます(翻訳文の「文中訳注 3」より)。
このブログポストの公開は 2013 年 8 月 2 日ですが、2013 年 12 月 3 日に、原文での見通しの通り、主要な PHP Framework コミュニティをコアメンバーとする PHP FIG において、Autoloading に関する新しい規約「PSR-4」が承認されました。そして、PHP FIG のメンバーである Drupal においても、Drupal 8 の規約を「PSR-4」に準拠するように変更しています。そのため、現在では、「PSR-0」準拠では要求された「Drupal/hello」というディレクトリパスは不要となり、その分だけより浅いディレクトリパスが使用可能となっています。すなわち、このブログポストにおけるサンプルコードに対応する「class ファイルの配置」は、具体的には、「PSR-0」準拠であった過去の規約においては「lib/Drupal/hello/Controller/HelloController.php」となっていましたが、「PSR-4」準拠となった現在の規約においては「src/Controller/HelloController.php」となります。

TAG 1 ::
DIARY :: AROUND THE CORNER :: Drupal
ARCHIVES 201406