Laravel はじめました [2. 準備]

※前回の記事は以下です

https://qiita.com/sosobl/items/616307285bee984ce60f

# 概要
- 日本語訳された公式ドキュメントに沿って実践していきます
    - [Laravel Document 5.7 日本語（終）](https://readouble.com/laravel/5.7/ja/installation.html)
- 今回は [準備]編
    - [インストール] は割愛

# 準備 > 設定
## 環境設定
- ルートディレクトリにある ```.env.example``` ファイルに環境周りの設定を書きましょう
    - ソース管理に含めてもよい

    - ```.env``` ファイルはソース管理ファイルに含めない
        - こちらは環境により内容を変更しましょう
        - サーバ内の環境変数として各変数を定義してもよい。最終的には環境変数で上書きされるとのこと。
        - docker で動かす場合には環境変数を注入する仕組みが必要

- ```.env``` ファイル内に定義された変数の値は ```env()``` 関数を通じて取得できる

    ```bash
    root@168e958bdfed:/var/www/html/backend# php artisan tinker # REPL コマンド
    Psy Shell v0.9.12 (PHP 7.4.15 — cli) by Justin Hileman
    >>> env("APP_ENV", "hogehoge");
    => "local"
    >>> App::environment();
    => "local"
    ```

- デバッグの際に値を非表示にしたい変数を指定できる（ブラックリスト方式）
    - ```config/app.php``` ファイルにキー値 "debug_blacklist" で連想配列を定義する

- ```config/*.php``` 内に定義された変数は ```config()``` 関数を通じて値を取得できる
    - ファイル名とオプション名をドットでつないだキー値を引数に渡す

    ```bash
    root@168e958bdfed:/var/www/html/backend# php artisan tinker
    Psy Shell v0.9.12 (PHP 7.4.15 — cli) by Justin Hileman
    >>> config('app.timezone'); # config/app.php にある 'timezone'
    => "UTC"
    >>> config('auth.providers'); # config/auth.php にある 'providers'
    => [
         "users" => [
           "driver" => "eloquent",
           "model" => "App\User",
         ],
       ]
    ```

- 本番環境にデプロイする時は ```$ php artisan config:cache``` を実行して ```config/*.php``` ファイル群を一つにまとめましょう
    - そうすれば、設定内容のロードが早いらしい
    - ```.env``` ファイルはロードされなくなるので、プログラム中に ```env()``` 関数を使用していた場合、null が返るので注意

- メンテナンスモード
    - ステータスコード 503 で MaintenanceModeException 例外が投げられるとのこと
    - アプリケーションがメンテナンスモードの間、キューされたジョブは実行されないとのこと
        - アプリケーションが通常状態へ戻った時点で、ジョブは続けて処理される。便利！
    - ```$ php artisan down```
        ![メンテナンスモード1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167986/a9a95f32-86a4-9048-550c-25484cf34e93.png)
    - ```$ php artisan down --message="メンテナンス中だよぉ" --retry=60```
        - メンテナンスメッセージを変更可能
        ![メンテナンスモード2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167986/6f096dfd-e14e-8d2d-5444-0103c44e3487.png)
    - ```$ php artisan down --allow=127.0.0.1 --allow=192.168.0.0/16```
        - 特定の IP からのアクセスは許可
    - ```$ php artisan up```
        - メンテナンスモード解除
    - ```resources/views/errors/503.blade.php``` を編集すればメンテナンスページを変更できる
        - デフォルトのメンテナンスページがどのファイルにあるのか見つからなかった。。。後で詳しく探してみる。
            - [2021/03/18 追記]
                - コマンドを実行した際、以下にファイルが生成される
                    - ```/storage/framework/views/${key}.php```
                    - どのようなルーティングをしてここまで辿り着くのか…


# 準備 > ディレクトリ構造
## イントロダクション
- models ディレクトリは意図的に存在しない
    - Eloquent モデルは app ディレクトリ配下にあるけど、ロードできる場所なら好きに置いてよいとのこと

## プロジェクトディレクトリ

```
/
├── app/
│　　...アプリケーションのほとんど全部のクラスは、このディレクトリの中に設定される
│
├── bootstrap/
│　　├── app.php
│　　│　　...フレームワークの初期処理を行う
│　　└── cache/
│　　　　　...初期処理のパフォーマンスを最適化するため、フレームワークが生成するルートやサービスのキャッシュファイルが保存されるフォルダ
│
├── config/
│　　...アプリケーションの全設定ファイルが設置されている
│
├── database/
│　　...データベースのマイグレーションとモデルファクトリ、初期値設定（シーディング）を配置する
│
├── public/
│　　...アセット（画像、JavaScript、CSSなど）を配置する
│　　└── index.php
│　　　　　...アプリケーションへの全リクエストの入り口となり、オートローディングを設定する
│
├── resources/
│　　...ビューやアセットの元ファイル（LESS、SASS、JavaScript）、すべての言語ファイルを配置する
│
├── routes/
│　　...アプリケーションの全ルート定義が設置されている
│　　├── web.php
│　　│　　...ステートフルなルーティングを定義する
│　　├── api.php
│　　│　　...セッションではなくトークンを用いた認証を行う、ステートレスなルーティングを定義する
│　　├── console.php
│　　│　　...よくわからない。。。クロージャベースの全コンソールコマンドを定義する（？）
│　　└── channels.php
│　　　　　...全ブロードキャストチャンネルを登録する場所
│
├── storage/
│　　...コンパイルされたBladeテンプレート、ファイルベースのセッション、ファイルキャッシュなど、フレームワークにより生成されるファイルが保存される
│　　└── app/public/
│　　 　　...public/storage/ がこのディレクトリを指すように、シンボリックリンクを張る必要がある
│　　 　　   $ php artisan storage:link
│
├── tests/
│　　...PHPUnit のコード置き場
│
└── vendor/
 　　...Composerによる依存パッケージが配置される
```


## appディレクトリ
- Console、Http、Providers などのサブディレクトリを持つ
    - Console
        - 全Artisanコマンドで構成される
    - Http
        - コントローラやフィルター、リクエストにより構成される
    - Artisanコマンドを使用することで、様々なサブディレクトリやクラスが生成される
        - ```$ php artisan list make``` で作成できるもの一覧が確認できる
- Broadcastingディレクトリ
    - ```make:channel``` コマンドで生成される
    - WebSocket で使用するらしい（？）
- Consoleディレクトリ
    - 全カスタムArtisanコマンドで構成される
    - ```make:command``` コマンドで生成される
- Eventsディレクトリ
    - オブザーバを実装する時に使用する
    - 後述の[Listenerディレクトリ]へ渡すイベントを定義する
    - ```make:event``` または ```event:generate``` コマンドで生成される
- Exceptionsディレクトリ
    - アプリケーションの例外ハンドラや例外そのものを配置する
    - 例外のログやレンダー方法をカスタマイズしたい場合は、このディレクトリのHandlerクラスを修正する
- Jobsディレクトリ
    - キュー投入可能なジョブを置いておく場所
    - ```make:job``` コマンドで生成される
- Listenersディレクトリ
    - イベントを処理するクラスを設置する
    - 前述の[Eventsディレクトリ]のイベントをオブジェクトとして受け取り、処理する
    - ```make:listener``` または ```event:generate``` コマンドで生成される
- Mailディレクトリ
    - Mail::sendメソッドを使用して送られるメールを組み立てるロジックをすべて、１つのシンプルなクラスへカプセル化するために使用する
    - ```make:mail``` コマンドで生成される
- Notificationsディレクトリ
    - アプリケーションから送られる全「業務上」の通知、たとえばアプリケーションの中でイベントが発生したことを知らせるシンプルな通知などで構成する
        - 非同期処理の完了通知とか？
    - ```make:notification``` コマンドで生成される
- Policiesディレクトリ
    - リソースに対し指定したアクションをユーザーが実行できるかを決定する認可ポリシークラスを設置する
    - ```make:policy``` コマンドで生成される
- Providersディレクトリ
    - サービスをコンテナと結合、イベントの登録、もしくはアプリケーションへやってくるリクエストを処理するために必要な用意をするタスクを実行するなど、アプリケーションの事前準備を行う全サービスプロバイダにより構成される
- Rulesディレクトリ
    - アプリケーションで使用するバリデーションルールオブジェクトで構成する
    - ```make:rule``` コマンドで生成される


# 準備 > Homestead
- vagrant で色々揃った環境を簡単に作れるよ、という話
    - 今回は docker で構築したため割愛


# 準備 > Valet
- ベレット（従者）と読むらしい
- mac では、 brew コマンドを使って直接 Laravel 環境をインストールできるよ、という話
- mac 内を汚してしまいそうなので、これは使わないかな...
    - サクッと環境構築したい時には便利だけど、そういう状況が思いつかない


# 準備 > デプロイ
- プロダクション環境へのデプロイプロセスの中に含めるべき Tips が紹介されてる
## 最適化
- プロダクション環境では、以下コマンドで Composer のオートローダを最適化した方がよいらしい
    - ```$ composer install --optimize-autoloader --no-dev```
## 設定ローディングの最適化
- 全設定ファイルをキャッシュされる一つのファイルへまとめる
    - ```$ php artisan config:cache```
## ルートロードの最適化
- 一つのメソッド呼び出しへ全ルート登録をまとめるため、数百のルートを登録する場合、ルート登録のパフォーマンスを向上する
    - ```$ php artisan route:cache```