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のライブラリはこんな感じで作られてるのかーということがわかります。