Laravelを触っていて、use Illuminate\~~~~とかnamespace App\Http\Controllers;みたいなのを見て、
「いや、Illuminateってどのディレクトリ指してんの?」
「Appってappディレクトリのことだよね?なんでappをAppって最初大文字にしてるの?」
みたいな疑問を抱いたことはないでしょか。
別に知らなくても良い部分ですが、ソースコードを追うことは理解を深めて、より柔軟な設計をするためにも必要なので、この機会に知っておくと良いかもです。
ということで、早速調べたことをメモっていきます。
そもそもPHPにはautoloadという仕組みがある。
PHPにはファイルを自動でロードしてくれるautoloadという仕組みがあります。
autoloadを使わない場合は、
require_once "hoge.php";
みたいにしますが、こんなの面倒ですよね。
そこで登場するのがautoloadです。
Laravelでもautoloadが使われいる。
Laravelでapp/composer.jsonを見てみると、
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
こんな記述があるはず。
"psr-4"というのは規約の名前なので、あまり気にしなくてOKです。
\\と2つのバックスラッシュがありますが、前の1つは次のバックスラッシュをエスケープしてるだけなので、実質\と同じ意味です。
そして、最初の"App\\": "app/",を見てください。
これはapp/をApp\と紐づけています。
つまり、App\と書けばappディレクトリを読み込んできます。
エイリアスについて
Laravelではuse Authとするだけで、認証機能が使えます。
では、このAuthはなぜこれだけで使えるのでしょうか。
それはエイリアスが登録されているからです。
ではconfig.app.phpを開いてみてると
'Auth' => Illuminate\Support\Facades\Auth::class,
こんな記述があるはず。
ここで、Authと記述したらIlluminate\Support\Facades\Auth::classを指しますよ。
と、登録しています。
composerでインストールしたライブラリは自動的に名前空間が登録される。
実はcomposerでライブラリをインストールしたら自動的に名前空間を定義してくれています。
名前空間はプロジェクト/vendor/composer/autoload_classmap.phpで定義されているので、見てみると、ズラーっと色々書かれていて、
'Illuminate\\Support\\Facades\\Auth' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Auth.php',
こんな感じで書かれているところもあるはずです。
ここで、Illuminate\Support\Facades\Authはvender/laravel/framework/src/Illuminate/Support/Facades/Auth.phpを指しますよと定義されています。
なので、use Authをすることで、vender/laravel/framework/src/Illuminate/Support/Facades/Auth.phpが読み込まれるわけです。
ちなみに
vendor/laravelというのがあるはずです。
さらにvendor/laravel/frameworkディレクトリの中を見てみると、ここにもcomposer.jsonがあります。
ここでは下記のように記述されています。
"autoload": {
"files": [
"src/Illuminate/Collections/helpers.php",
"src/Illuminate/Events/functions.php",
"src/Illuminate/Foundation/helpers.php",
"src/Illuminate/Support/helpers.php"
],
"psr-4": {
"Illuminate\\": "src/Illuminate/",
"Illuminate\\Support\\": ["src/Illuminate/Macroable/", "src/Illuminate/Collections/"]
}
},
つまり、Illuminate/と記述すれば、src/Illuminate/を指しますので、Laravelのライブラリはこんな感じで作られてるのかーということがわかります。