autoloadはファイルを自動で読み込む仕組みのことで、requireなしでuse演算子を定義するだけでPHPのクラスを使えるようにする機能。
Composerがインストールされていることを確認する
require文の代わりにComposerのオートロード機能を使用します。
laravelでプロジェクトを作成する際にcomposerコマンドを使用しているのでインストールされていると思われるのですが、composerがなければインストールする。
※composerがインストールされている場合、composerと打つとでてきました
composer.jsonに追記する
読み込んでほしいファイルや、名前空間のあるファイルをcomposer.jsonのautoload内のpsr-4部分に追記していく
Composerのオートロードでつかう名前空間(namespace)とは
【PHP超入門】名前空間(namespace・use)について
psr-4とは
psr-4は入力規約のことで、
psr-0は2014年10月以降非推奨となっており、新しいプロジェクトではpsr-4の規約を使うことが推奨されており、psr-4はpsr-0に変わる新しい規約とのこと
psr-0
での、名前空間つきクラス名とファイルパスについての特徴
- 名前空間の\をディレクトリセパレーター/に置き換える
- クラス名の_をディレクトリセパレータ/に置き換える
- 最後に.phpを付ける
psr-4
での、名前空間つきクラス名とファイルパスについてのpsr-0からの主な変更点
- 名前空間接頭語に対して任意のディレクトリを設定できる。
- クラス名の _
は特別な意味を持たない
例えばTest_Classだった場合は下記になる
psr-0: /〜/Test/Class.php
psr-4: /〜/Test_Class.php
composer.jsonに追記する
例えば、下記のようなファイル構成の時、Testディレクトリに読み込んでほしいファイル、名前空間があったらcomposer.jsonのautoload部分に追記します。(※laravelの場合)
Project
├─ app
│ ├─ Console
│ (略)
│ ├─ Models
│ │ └─ Test
│ └─ Providers
├─ bootstrap
├─ config
├─ database
├─ public
├─ resources
├─ routes
├─ storage
├─ tests
├─ vendor
│ (略)
│ └─ composer
│ (略)
│ ├─ autoload_classmap.php
│ └─ autoload_psr4.php
├─ view
├─ .env
├─ composer.json
├─ composer.lock
(略)
└─ yarn.lock
※namespace名は大文字からはじめなければならないので注意
記述方法は
設定したい名前空間\\ : 対応するベースディレクトリ
"autoload":{"psr-4":{"App\\":"app/","Test\\":"app/Models/Test"//追記},"classmap":["database/seeds","database/factories"]},
composer.jsonを編集した後は下記コマンドを実行してcomposer.jsonの構文チェックする
$ composer validate
composer validate実行後、問題なければ下記コマンドを実行する
$ composer dump-autoload
autoload_psr4を確認する
composer.jsonで、psr4のautoload登録をしたので、autoload_psr4.phpファイルが更新されているか確認する。
<?php// autoload_psr4.php @generated by Composer$vendorDir=dirname(dirname(__FILE__));$baseDir=dirname($vendorDir);returnarray((略)'Test\\'=>array($baseDir.'/app/Models/Test'),);
requireなしでも下記のように使えるようになっている!
<?phpnamespaceApp\Http\Controllers;useTest\TestClass;ClassTestController{
まとめ
新しいディレクトリを作ったら忘れずにautoloadする。
composerを使うとディレクトリが増えるたびにdump-autoloadするのが面倒だったりもするというデメリットもあるとのことです。