おそらくこの記事は最初に読むべきからもしれませんが、私自身は個人的に少しばかりLaravelに触れた程度の後に読んだ方がよいと思っています。だいたいの作りや構造を理解した上で読んだ方が有意義だからというのがあります。
ソース自体は日々更新され Githubのlaravel/laravelでいつでも見ることができます。
また公式ドキュメントは日本語もあるので学習は容易です。
そもそもLaravelとは何か?というときにここではキャッチーなコピーライトを求めている人間はいません。エンジニアはその機能を具体的に理解したいというだけです。それ以外の目的はありません。それはライフサイクル概論を読めば一目瞭然です。
生のHTMLはディレクトリの構造とファイル名に従ってユニークなアクセスURLを作ることができます。該当の構造とURLは常に同じルールで記述されるのでアクセスできることになります。しかしLaravelをはじめとしたフレームワークは、そのリクエスト(アクセス)をすべてindex.phpに集中させます。様々なURLは、それぞれのディレクトリをめぐるのではなくずべてindex.phpに集められるのです。
public/index.php
このファイルにエラーを起こせばすべてのアクセスがダウンします。ためしにabort(500);
を追加してみてください。これはフレームワークのシステム全体が何も処理できないことを示しています。
リクエストはapp/Http/Kernel.php
で処理されます。HTTPカーネルと通常よばれます。ここでは何をやっているかというとリクエストを受け取ってレスポンスを返していうだけなのです。なぜこんなことをする必要があるのか?(あるいはなぜこの機能が人気の秘訣なのか?)それは、これまでApacheやNginxなどのWEBサーバーが行ってきたリクエスト処理やレスポンスをフレームワーク自身がやってしまおうという発想です。これまでWEBサーバーにゆだねていた処理を言語それ自身が行おうとする意思です。かつてのjavaフレームワークなどもそういった発想でした。Ralisもそう、Djangoもそう、WEBサーバーを介したフレームワークはすべて基本的にはWEBサーバーの特権を自身の言語の中に取り込みたいという思いがあります。言語で起きたエラーをWEBサーバーが処理するのではなく、言語の内部処理でエラーを処理しWEBサーバーにはその情報をレスポンスとして送信するだけという動作がやりたいのです。
HTTPカーネルを修正・変更することは殆どありません。修正・変更が生じるのは公式LaravelやSymfonyのバグ修正が行わたときぐらいです。Laravelを利用して開発するもの者にとってはブラックボックスであって構いません。
Laravelにはサービスプロバイダという概念があります。Laravelの機能(サービス)を提供するという意味ですが、その名の通りLaravelはその機能(サービス)を個別に所持しています。そのリストはapp/config/app.php
に配列で書かれています。それらはPackageとしてそれぞれcomposerで取り込まれているものが殆どです。このわかりづらい名前のサービスプロバイダーは、Laravelの機能の非常に抽象的な役割を担っています。
例えば、Laravel 5.8 認可ではIlluminate\Auth\AuthServiceProvider::class,
について詳しく解説しています。AuthServiceProviderは認証/認可に関連する機能をLaravel全体として担っています。どのページでもこのサービスを使うことができて、どのページも同じセキュリティーの強度として設定されます。
デフォルトでは以下のプロバイダーが提供されています。
Auth\AuthServiceProvider
Broadcasting\BroadcastServiceProvider
Bus\BusServiceProvider
Cache\CacheServiceProvider
Foundation\Providers\ConsoleSupportServiceProvider
Cookie\CookieServiceProvider
Database\DatabaseServiceProvider
Encryption\EncryptionServiceProvider
Filesystem\FilesystemServiceProvider
Foundation\Providers\FoundationServiceProvider
Hashing\HashServiceProvider
Mail\MailServiceProvider
Notifications\NotificationServiceProvider
Pagination\PaginationServiceProvider
Pipeline\PipelineServiceProvider
Queue\QueueServiceProvider
Redis\RedisServiceProvider
Auth\Passwords\PasswordResetServiceProvider
Session\SessionServiceProvider
Translation\TranslationServiceProvider
Validation\ValidationServiceProvider
View\ViewServiceProvider
このサービスは可能な限り使い回すということが大切です。同様の機能をコントローラで実装したり野暮な関数で代用したりしないようにしましょう。最初は理解に苦しみますができるだけサービスを使い回すようにするとよいです。
各コントローラで処理された結果はたいていの場合viewに反映されます。例えばトップページのBladeは以下に設定してあります。
app/resources/views/welcome.blade.php