【PHP】Laravel 学習メモ /  フレームワーク構成の概念 さわり 

PHPのフレームワークの１つであるLaravelについて、その仕組みを理解したいと思い構成について調べたのでざっくりメモ。まだ勉強中なので、また改めて上手く纏めたい。
今回は、機能の意味や目的などを書きます。

[Laravelドキュメント](https://readouble.com/laravel/)

目次：
１、ライフサイクル
２、サービスコンテナ
３、サービスプロバイダ

#１、ライフサイクル
####１、アプリケーションに対するリクエストは、全てpublic/index.phpファイルが入り口となる。

index.php:
1-1、composerが生成したオートローダーの定義をロード
1-2、bootstrap\app.phpスクリプトからLaravelアプリケーションのインスタンスを取得
↓
Illuminate\foundation\applicationがインスタンス化

####2、kernelが生成される
HTTPリクエスト情報からRequestインスタンスを生成し、handleメソッドに渡す。

handleメソッド：
Requestを受け取り、Responseをリターンする

#２、サービスコンテナ

####サービスコンテナとは：
クラス依存解決のための仕組みを提供する機能（クラスのインスタンスを管理）。
クラスの中でnewをせず、必要なインスタンスは外から突っ込む。

####目的：
クラス依存の状態から、疎結合なコードを目指す。
何故なら、クラス依存とは依存関係のあるコードをクラス内で生成する
＝　単体テストができないなど、使い勝手が悪い。

####依存関係とは？
実社会に置き換えると、例えば旅館に行ったとき、入り口には「〜様」と書かれていることがあると思います。しかし、名前を襖などに直接ペンでは書きませんよね。書いたら消せないですしそのお客様専用になってしまいます。本来は、紙などに名前を書いて貼ったりしています。翌日別のお客様が泊まりに来たら、張り替えれば良いわけです。直接書いてしまうとその部屋はあるお客様に依存している状態と言え、都度張り替えることで疎結合を実現できます。適切な例えかわかりませんがイメージはこんな感じ。

依存状態

```php
class A
    public function 関数 {
    $b = new B //←Aクラスの中でBクラスのインスタンスを作っている = AクラスはBクラスに依存している
   }

```

#３、サービスプロバイダ
####Laravelの初期処理の過程全体で一番重要な機能。

####サービスプロバイダとは：
・Laravelアプリケーション内の全ての機能（クラスから提供される機能）が起動される場所。
・「どのクラスをインスタンス化するか決定」するためのロジック登録が行われる場所。

####初期処理とは:
サービスコンテナの結合や、イベントリスナー、フィルター、ルートなどを登録。

####config/app.php
config/app.phpを見ると、providers配列があります。アプリケーションのためにロードされます（ほとんどは、実際必要になった時にロードされる）。

```php
'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        Illuminate\Database\DatabaseServiceProvider::class,
        Illuminate\Encryption\EncryptionServiceProvider::class,
        Illuminate\Filesystem\FilesystemServiceProvider::class,
        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
        Illuminate\Hashing\HashServiceProvider::class,
        Illuminate\Mail\MailServiceProvider::class,
        Illuminate\Notifications\NotificationServiceProvider::class,
        Illuminate\Pagination\PaginationServiceProvider::class,
        Illuminate\Pipeline\PipelineServiceProvider::class,
        Illuminate\Queue\QueueServiceProvider::class,
        Illuminate\Redis\RedisServiceProvider::class,
        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
        Illuminate\Session\SessionServiceProvider::class,
        Illuminate\Translation\TranslationServiceProvider::class,
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,

        /*
         * Package Service Providers...
         */

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,

    ],

```
以上。
それぞれの具体的な使い方など細かく纏められるよう引き続き頑張って勉強します。