The blue-colored links are internal links for this site.
As some of them are compatible with Ajax by this module, you can watch the contents of this wiki without page transition.
And the remainder of them are similarly compatible with Ajax by TNC Ajax Site Module, too.
DIARY :: AROUND THE CORNER :: 20140630003
オリジナルの原文公開時以降の規約変更とそれに伴い必要となる原文・翻訳文の読み替えについての補足説明(詳細)を行っています。
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!」 において、
この点に最も直接的に関連する記述(翻訳文)は、以下になります。
「PSR-0」とは、完全なクラス名はファイルシステム上で表されなければならないとする規約です。
これは少々やっかいな規約であり、それに対して責任を有する PHP の標準化グループは、
これを要求しないような新しい規約を作るべく検討しているところです。
彼らが他の規約を受け入れるよりも新しい規約を作ることを優先するならば、それは「PSR-4」と命名されるはずです。
現在、「PSR-4」となるであろう望ましいルールへと転換することが、Drupal core にとっての課題の 1 つとなっています。
そしてそれが実現したならば、喜ぶべきことに、
Drupal 8 のモジュールの中でより浅いディレクトリパスが使用可能になることでしょう。
このように、原文は、「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」には、次のような規定があります。
正確には、プログラミングの専門用語における「完全修飾クラス名(fully qualified class name)」のことであり、
原文(翻訳文)においては、具体的には、「\Drupal\hello\Controller\HelloController」という表記のことです。
そして、これを「PSR-0」準拠でファイルシステム上に展開すると(ファイル単体の名称は「クラス名.php」とする必要があるため)、
従って、Drupal 8 のトップディレクトリからの相対パスは、
「modules/hello/lib/Drupal/hello/Controller/HelloController.php」となる。
一方、「PSR-4」には、このような規定はありません。
その代わりに、次のような規定があります(わかりやすさを優先し、丸めた表現にしています)。
トップレベルの namespace から任意のレベルの namespace 部分まで(=「namespace prefix」)を
特定のディレクトリ(=「base directory」)に対応させることができる。
(2)ただし、「namespace prefix」より後から「クラス名」の手前までの namespace 部分は、
「base directory」の下位ディレクトリとして、
「名前空間の区切り(バックスラッシュ)」を「ディレクトリの区切り」に変換し、対応付けされる。
完全なクラス名の「namespace prefix」部分は、ある特定のディレクトリに対応させることができるが、
「namespace prefix」部分より後の部分は、ファイルシステム上で表現されなければならない。
「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 の規約においては、次の原則に従います。
(Drupal のトップディレクトリからは「modules/MY_MODULE_NAME/src」となります)
次に、「PSR-0」準拠から「PSR-4」準拠への変更に際しては、次の原則に従います。
従って、(Drupal の Autoloading を利用している場合には)プログラムコードを変更する必要はない。
(2)この変更は、「class ファイルの配置」にのみ影響を与える。
「class ファイルの配置」に関する具体的指定についてのみ読み替える必要があることになります。
原文・翻訳文では、上記のように、次のような namespace を伴った class を例としています。
<?php
namespace Drupal\hello\Controller;
class HelloController {
// some codes
}
それに対して、原文・翻訳文のように、「PSR-0」対応の「class ファイルの配置」(過去)は、次のようになっています。(Drupal のトップディレクトリからは「modules/hello/lib/Drupal/hello/Controller/HelloController.php」となります)
「Drupal\hello」が「namespace prefix」とされ、「Controller」以降が「src」以下に展開されることから、次のようになります。
(Drupal のトップディレクトリからは「modules/hello/src/Controller/HelloController.php」となります)
「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」より)。
主要な 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
このメールフォームを使うことにより、TransNetCreation にコンタクトすることができますので、
お気軽にご連絡いただけましたら幸いです。( * 印が付いているのは、必須項目です。)
DIARY :: AROUND THE CORNER :: 20140630002|翻訳「Drupal 8: Hello OOP, Hello world!」:補足 1
DIARY :: AROUND THE CORNER :: 20140630001|翻訳「Drupal 8: Hello OOP, Hello world!」