4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Laravelとcomposerの名前空間やエイリアスの理解をしよう

Posted at

Laravelを触っていて、use Illuminate\~~~~とかnamespace App\Http\Controllers;みたいなのを見て、

「いや、Illuminateってどのディレクトリ指してんの?」
Appってappディレクトリのことだよね?なんでappAppって最初大文字にしてるの?」

みたいな疑問を抱いたことはないでしょか。

別に知らなくても良い部分ですが、ソースコードを追うことは理解を深めて、より柔軟な設計をするためにも必要なので、この機会に知っておくと良いかもです。

ということで、早速調べたことをメモっていきます。

そもそもPHPにはautoloadという仕組みがある。

PHPにはファイルを自動でロードしてくれるautoloadという仕組みがあります。

autoloadを使わない場合は、

require_once "hoge.php";

みたいにしますが、こんなの面倒ですよね。

そこで登場するのがautoloadです。

Laravelでもautoloadが使われいる。

Laravelでapp/composer.jsonを見てみると、

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

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?