オートロード
concrete5は、名前空間に従って自動的にクラスを読み込みます。例:
$page = \Concrete\Core\Page\Page::getByPath('/about-us');
\Concrete\Core\Page\Page クラスがどこにあるかを、どのようにして知ることができるのでしょうか?それは、我々がPSR-4フォーマットをもとにカスタマイズしたオートローダーを使用しているからです。
PSR-4はプロジェクトごとに異なる名前空間プリフィクスを任意の開始ディレクトリに関連づけることができます。それが、我々の取った方法です。concrete5のクラスローダーでは、concrete/src/ ディレクトリが \Concrete\Core 名前空間に対応します。つまり、\Concrete\Core 名前空間内にある全てのクラスは src ディレクトリ配下の命名規則に従ったディレクトリ内にあるということです。ですから、次のクラス
\Concrete\Core\Page\Page
は、下記のファイルに記載されているはずです。
concrete/src/Page/Page.php
コアソースディレクトリに依存するコードを書く際は、必ずPSR-4にそのまましたがってください。クラスは大文字で始まる、などです。
src/ ディレクトリにないクラス(ブロックコントローラー、属性コントローラーなど)は、PSR-4と同様に大文字で始めるなどのルールがありますが、ファイル名はconcrete5のクラシックな小文字+アンダースコア方式になります。これらのファイル名はキャメルケースに変換されクラス名と対応します。
具体的には、例えばブロックディレクトリとその内容は、concrete5バージョン5.6までと変化はありません。ページリストブロックのコントローラーはこれまでと同様の位置にあります。
concrete/blocks/page_list/controller.php
もしPSR-4に厳格にしたがうと、クラス名はこのようになるべきです。
controller
そして、名前空間はこうなります
\Concrete\Block\page_list
これではあまり美しくありませんし、別の問題も引き起こします。そのため、我々は次のクラスがリクエストされたとき、
\Concrete\Block\PageList\Controller
先に次のクラスがあるかどうかをチェックし…(デフォルトのPSR-4オートロードの仕様です)
concrete/blocks/PageList/Controller.php
存在しなければ、我々独自の方法で、バックスラッシュはディレクトリセパレーターに、キャメルケースはアンダースコアに変換します。
concrete/blocks/page_list/controller.php
以上が、concrete5バージョン5.7でライブラリー以外のクラスの取り扱い方になります。
完全なリファレンス:名前空間とクラスの位置
標準 PSR-4
次の名前空間は、それぞれの src/ ディレクトリ内のファイルに、完全にPSR-4に準拠したかたちで対応します。
- Concrete\Core\ -> concrete/src/
- Application\Src\ -> application/src/
- Concrete\Package\MyPackageNamespace\Src\ -> packages/my_package_namespace/src/
これらの位置に格納されるファイルは全てPSR-4のファイル名とクラス名の規則に完全に準拠する必要があります。
カスタマイズされた PSR-4
concrete5コアディレクトリ
次の名前空間は、 concrete/ ディレクトリ内のそれぞれの位置に自動的に対応します。
- Concrete\Attribute -> concrete/attributes/ (例: Concrete\Attribute\Boolean\Controller -> concrete/attributes/boolean/controller.php, Concrete\Attribute\Select\Option -> concrete/attributes/select/option.php)
- Concrete\MenuItem -> concrete/menu_items/ (例: Concrete\MenuItem\MyMenu\Controller -> concrete/attributes/my_menu/controller.php)
- Concrete\Authentication -> concrete/authentication/ (例: Concrete\Authentication\Facebook\Controller -> concrete/authentication/facebook/controller.php)
- Concrete\Block -> concrete/blocks/ (例: Concrete\Blocks\Autonav\Controller -> concrete/blocks/autonav/controller.php, Concrete\Blocks\Form\MiniSurvey -> concrete/blocks/form/mini_survey.php)
- Concrete\Theme -> concrete/themes/ (例: Concrete\Theme\Elemental\PageTheme -> concrete/themes/elemental/page_theme.php)
- Concrete\Controller\PageType -> concrete/controllers/page_types/ (例: Concrete\Controller\PageType\BlogEntry -> concrete/controllers/page_types/blog_entry.php)
- Concrete\Controller -> concrete/controllers/ (例: Concrete\Controller\Dialog\UploadFile -> concrete/controllers/dialog/upload_file.php)
- Concrete\Job -> concrete/jobs/ (例: Concrete\Jobs\IndexSearchEngine -> concrete/jobs/index_search_engine.php)
- Concrete\StartingPointPackage -> concrete/config/install/packages/ (例: Concrete\StartingPointPackage\ElementalFull\Controller -> concrete/config/install/packages/elemental_full/controller.php)
パッケージディレクトリ
上記のルールはconcrete5のパッケージにも適用されます。\Concrete\Package\YourPackageHandle 部分を差し替えて使用してください(YourPackageHandle は、packages/ ディレクトリ内のあなたのパッケージのディレクトリ名 your_package_handle をキャメルケースに変換したものです)。例:
- Concrete\Package\FancySlider\Block\FancySlider\Controller -> packages/fancy_slider/blocks/fancy_slider/controller.phgp
- Concrete\Package\FileSetTools\Attribute\FileData\Controller -> packages/file_set_tools/attributes/file_data/controller.php
- Concrete\Package\FileManagerMenu\MenuItem\FileManager\Controller -> packages/file_manager_menu/menu_items/file_manager/controller.php
アプリケーションディレクトリ
application/ ディレクトリは、それぞれのconcrete5アプリケーションのためのカスタムコードを格納するディレクトリです。名前空間の最初のセグメントが Application\ になる以外は、concrete/ ディレクトリと同じパターンを踏襲します。
- Application\Block\FancySlider\Controller -> application/blocks/fancy_slider/controller.phgp
- Application\Attribute\FileData\Controller -> application/attributes/file_data/controller.php
- Application\MenuItem\FileManager\Controller -> application/menu_items/file_manager/controller.php
このルールは、コアクラスをオーバーライドする際にも適用されます。
- Application\Block\RssDisplayer\Controller -> application/blocks/rss_displayer/controller.php
原文:Autoloading