Laravel Up & Running 3rd editionの箇条書き抜粋

 # これは何?
:::note warn
この記事は実務でLaravelを使う時にそういえばあんな機能あったなというHookにすることを目的としています
内容を詳細に解説するものではありません
:::
  - O'reilly から出ている Laravelの解説書 Laravel Up & Runningの箇条書き抜粋
  - https://www.amazon.co.jp/Laravel-Running-Framework-Building-Modern-dp-109815326X/dp/109815326X/ref=dp_ob_title_bk
  - Laravelは便利な機能がたくさんあり、いろいろな複雑な処理を宣言的に書けるようになっている。
  - 一方そういった便利機能の存在を知らないと手続き的に車輪の再発明ロジックを書いてしまいコードが冗長になってしまうことが多い
  - 現状邦訳がないため、そのような便利機能を備忘録的にまとめた
  - 備忘録を兼ねた箇条書き抜粋でしかないので、詳細は原書や他の解説書・解説記事を参照してください
  - 問題がありましたら修正または非公開にしますのでご連絡ください
  - 未完成、随時追記していきます
  - 各章に設けられた「テスト」の節は省略しています
  - Laravel 10.x 前提
 
 # 第2章 Setting Up a Laravel Development Enviroment
 Laravelの開発環境を設定する

全てのLaravel Applicationの核となる設定はconfigフォルダに存在する。configフォルダの各ファイルはPHPの配列を返し、ドットで区切られる、ファイル名と後に続くキーを含むconfig keyで値にアクセス可能。

Laravelのいくつかの機能（キャッシュと最適化を含む)はenvヘルパ関数をconfigフォルダ外で使用すると機能しない。

.envファイル
いくつかの重要な設定
APP_KEY string
APP_DEBUG boolean 
`debug`レベルのログを出力するか

# 第3章 Routing and Controllers
### ルーティングとコントローラ

- 複数method Route::match['get', 'post']
- 全てのmethod Route::any

#### Laravelの Controller/Methodを参照する構文
 - tuple syntax
 - string stntax

#### ルートパラメータの指定方法
 - セグメントパラメータ
 - optionalなセグメントパラメータ
 - 正規表現
 - constraint helpers `whereNumber` `whereAlpha`

#### ルートのマッチ順
 - 記載順にマッチする

#### ルートパラメタとハンドラメソッド引数の関係
 - ルートパラメタの出現順にハンドラメソッド引数に代入される
 - `{appId}/{userId}/login` というルートのハンドラに `function($userId,$appId){...}`
逆の値が代入される。習慣上名前を揃えたほうがいいが、代入される値と変数名に関係はない（Laravelは順番しか見ない)

#### ルート名とヘルパ
 - urlヘルパ => pathを渡すとフルのurlを返してくれる
 - 名前付きルート `name`ヘルパで定義できる
 - `route` ヘルパで呼び出す
 - `ルートとviewの名前はリソース名の複数形.メソッド(action)`という名前をつけるのが一般的な習慣
 - (users.get photos.destroy)など
 - `route`ヘルパにパスパラメータおよびクエリパラメータを引き渡す方法はいくつかある(連想配列または配列)

#### ルートグループ
ルートグループは共通の機能(`prefix`, `namespace`, `middleware`, etc)を持った複数のルートをまとめる
`Route::group`

#### ミドルウェアの適用
- コントローラ単位でのミドルウェアの適用
    - コントローラのコンストラクタでmiddlewareメソッドを呼ぶことで、コントローラ特有のミドルウェアを適用できる
    - `middleware` メソッドに `only` か `except`をチェインすることでmiddlewareが適用されるメソッドを制限できる

#### サブドメインルーティング
`Route::domain` メソッド

#### 名前付きルートグループ
`Route::name`に`group`メソッドをチェーンさせると、グループ内のルート名の接頭語(プレフィックス)になる
```
Route::name('users.')->prefix('users')->group(function(){
    Route::get('/{id}', function(){
        //...
    })->name('show');
});
```

`users.show`が名前付きルートの名前になる

#### ルートグループコントローラ
以下のようにルートグループ単位で共通のコントローラを設定できる
```
Route::controller('HogeClass::class')->group(fucntion(){
    Route::get('/', 'index');
    //...
}
```

#### 署名付きルート
正確なURLを知っている人だけがアクセスできる一種の認証/認可機能
時限付き署名付きルートも作れる

 - 初めに、なんらかの処理を行うルートを設定する
 - 次に `URL::signedRoute` や `URL::temporarySignedRoute`メソッドを使い署名付きルートのURLを生成しユーザに送る
 - 署名していないアクセスを防止するには 元々のルートに`signed` middleware を使うか `$request->hasValidSignature` メソッドで判定して処理する

### ビュー
 - `Route::view` メソッド
    route定義上でviewを返すRouteを定義できる
### コントローラ
 - リソースコントローラ
    `php artisan make:controller AbcController --resource`
    で標準的なリソース操作メソッドを備えたコントローラのテンプレートを生成してくれる。
    `Route::resource`で全てのメソッドをrouteにバインドできる
 - APIリソースコントローラ
    `php artisan make:controller AbcController --api`
    `Route::apiResource` でバインド
 - ルートとバインドされたメソッド一覧の表示
    `php artisan route:list` `--exclude-vendor`オプションでライブラリから内部的に利用されているルートを除外
 - シングルアクションコントローラ
    1コントローラ1routeにしたい場合に マジックメソッド `__invoke` に処理内容を記載し、`Route::xxx`でクラスにバインドできる

#### ルートモデルバインディング
 - ルートモデルバインディングとは、パスパラメータからモデルを呼び出しコントローラに注入する機能
     - 簡単なやり方(パラメータ名とモデル名を一致させる)
    `/conferences/{id}`というルートで自動バインディングさせるには
    パラメータ名をモデルに一致させる(`id`->`conference`)
    `/conferences/{conference}`
    あとは、コントローラメソッドで型ヒントを行なうと自動で対象のモデルが注入される
    ({conference}に相当するセグメントがidとして解釈される)
    ``` コントローラ
    function (Conference $conference) {
        //...
    }
    ```
    他にも色々オプションがある(割愛)

#### ルートキャッシュ(route caching)
 - クロージャで定義されたルートがあるとキャッシュできない
 - `php artisan route:cache` でキャッシュ
 - `php artisan route:clear` でクリア

#### フォームメソッドスプーフィング
 - HTML FORMから `GET` `POST`以外のメソッドを使いたい時に使用する
 - bladeのformタグ内で`@method('PATCH')` などと使用する

#### CSRFプロテクション

#### リダイレクト
 - redirect() ヘルパ
     - redirect()
     - redirect()->to()
     - redirect()->route()
     - redirect()->back()
     - `Redirect` ファサード
 - その他のメソッド
    - refresh()
    - away()
    - secure()
    - guest()
    - intended()
 - 引数の受け渡し
     - with()メソッド
     - withErrors()メソッド
         - バリデータインスタンスをそのまま渡せる
     - old()ヘルパ

#### リクエストの中止(Abort)
 - abort()
 - abort_if()
 - abort_unless()

#### カスタムレスポンス
 - response()
     - response()->make()
     - response()->json() ,jsonp()
     - response()->download(), file(), streamDownload()
         - streamDonwload()はクロージャechoでストリームデータを吐き出す関数を引数に取る

 # 第4章 Blade Templating
 ブレードテンプレート
  - bladeは.netのRazorエンジンにインスパイアされている
  - 基本構文
      - @ + directive
      - { echoする内容 }

 #### データのecho
  - {{ $variable }}
```
<?=htmlentities($variable)?>
```
と同じ
  - {!! $variable !!}
  HTMLエスケープをしないで内容を出力する
  - フロントエンドフレームワークの構文で `{{ hoge }}`が必要な場合
    blade上では `@{{ hoge }}` と書けばいい

#### 制御構文
 - `@if` `@else` `@elseif` `@endif`
 - `@unless` `@endunless`
 - `@for` `@foreach` `@while`
 - `@forelse` `@empty` `@endforelse`

#### テンプレートの承継
 - `@section` `@endsection` `@yield` `@show`
 - `@extends`
 - `@parent`
 - `@include`
 -