Laravel バージョン11の特徴

## ファイルの数が減少した
• Laravel10ではapp/Http/Middleware配下に9つファイルがあったが。フォルダごとmiddlewareが消えている。
ミドルウェアを登録する際は、bootstrap/app.phpファイルに登録する。

詳しくは下記リンクで
https://biz.addisteria.com/laravel11_middleware/

　• Laravel10ではServiceProviderは5個あったが、AppServiceProvider.phpの1個までに減少した。
　routesフォルダの中から`api.php`と`channels.php`ファイルが削除された。
 しかし、これらのファイルはコマンドを用いることで復活させることができる。
 
``` CLI:api.php復活コマンド
php artisan install:api
```

``` CLI:channels.php復活コマンド
php artisan install:broadcasting
```

• Configフォルダの中身も15個から10個に減少した。

### Consoleがなくなった
app/Consoleもデフォルトで削除された。バッチ処理などのスケジューリング処理を記述したい場合は、**routes/console.php**に直接記述する。

詳しくは下記リンクで
https://biz.addisteria.com/laravel11_console/


## リアルタイム機能をより簡単に実装する
Laravel Reverbと呼ばれる高速かつスケーラブルWebSocketサービスを提供する。

詳しくは下記リンクで
https://laravel.com/docs/11.x/reverb

## より細かいレートリミットが可能に
レートリミットとはルーティングに対するトラフィックの量を制限する機能のことである。
以前はper-minute（1分ごと）まで可能であったが、今回からper-second(1秒ごと）の設定が可能になった。
``` PHP:
// 1秒間に1回の制御
RateLimiter::for('invoices', function (Request $request) {
    return Limit::perSecond(1);
});
```
高頻度でアクセスされるAPIや短時間に多くのリクエストを処理する必要があるアプリケーションに有効。

詳しくは下記リンクで
https://laravel.com/docs/11.x/routing#rate-limiting

## ヘルスチェック機能
ドメイン/up を行うことでヘルスチェック画面が表示される。
非表示にしたい場合は、`bootstrap/app.php`内のhealth: ‘/up’ 部分をコメントアウトする。

## 暗号化キー交換機能
アプリケーションの暗号化キーを更新してもユーザーはログアウトされることなく、以前のキーで暗号化されたデータも復元化することができる。

APP_PREVIOUS_KEYS環境変数を通じて、アプリケーションの以前の暗号化キーをカンマ区切りのリストとして定義することができる。
セキュリティを高めるために定期的にキーを更新する場合に使われる。

詳しくは下記リンクで
https://laravel.com/docs/11.x/encryption

## キューのインタラクションテスト
インタラクションテストとは、テスト対象のコードが特定のメソッドを正しく呼び出すことができるかどうかを検証するものである。
Laravel11では、withFakeQueueInteractionsメソッドを用いることでキューのインスタラクションテストを行うことができる。
これによりキューを利用したアプリケーションの信頼性と品質を向上させることができる。

詳しくは下記リンクで
https://laravel.com/docs/11.x/queues#testing

## 新たなartisanコマンド
クラス、enum、トレイト、インターフェイスを新規で作成するためのコマンドが追加された。
``` PHP:
php artisan make:class
php artisan make:enum
php artisan make:interface
php artisan make:trait
```

## モデルのcastsがメソッドに変更
castsはこれまで静的プロパティだったが、メソッドに変更された。

``` PHP:変更前
    protected $casts = [
        'email_verified_at' => 'datetime',
        'password' => 'hashed',
    ];
```

``` PHP:変更後
    protected function casts(): array
    {
        return [
            'email_verified_at' => 'datetime',
            'password' => 'hashed',
        ];
    }
```

## onceヘルパー
　onceヘルパーは与えられたコールバックを実行し、その結果をリクエストの期間中メモリにキャッシュする。
同じコールバックを使用してonce関数を後続で呼び出した場合は、以前にキャッシュされた結果が返却される。

　同一のリクエスト内で同じ結果を複数回取得する必要があるが、その処理を繰り返し行うことでパフォーマンスが低下することを避けたい場合に便利である。

``` PHP:onceヘルパー
<?php
 
class NumberService
{
    public function random(): int
    {
        return once(fn () => random_int(1, 1000));
    }
}
 
$service = new NumberService;
$service->random();
$service->random(); // (cached result: キャッシュの値を参照)
 
$secondService = new NumberService;
$secondService->random();
$secondService->random(); // (cached result: キャッシュの値を参照)
```
上記のように関数がオブジェクトインスタンス内から実行されると、キャッシュされた結果はそのオブジェクトインスタンス固有のものとなる。

詳しくは下記リンクで
https://laravel.com/docs/11.x/helpers#method-once

## カラムの変更
　カラムを変更する際に変更後もカラム定義を維持したい場合すベての修飾子を明示的に含める必要があり、足りない属性は削除される。

例として`unsigned`、`default`、`comment`属性を持つ`votes`カラムを作成するマイグレーションがあるとする。

``` PHP:初めに作成したマイグレーション
Schema::create('users', function (Blueprint $table) {
    $table->integer('votes')->unsigned()->default(1)->comment('The vote count');
});
```

その後にカラムに対し`nullable`に変更するマイグレーションを追加する。
``` PHP:nullableに変更するマイグレーション
Schema::table('users', function (Blueprint $table) {
    $table->integer('votes')->nullable()->change();
});
```
Laravel10ではこのマイグレーションはカラムの`unsigned`、`default`、`comment`属性を保持していた。
しかし、Laravel11からはマイグレーションには以前定義していた属性も全て含める必要があり、含めない場合は削除される。

``` PHP:laravel11での記述方法
Schema::table('users', function (Blueprint $table) {
    $table->integer('votes')
        ->unsigned()
        ->default(1)
        ->comment('The vote count')
        ->nullable()
        ->change();
});
```
`change`メソッドはカラムのインデックスを変更するものではないため、カラムを変更する際はインデックス修飾子を用いて明示的に追加や削除を行うこと

``` PHP:
// インデックス追加
$table->bigIncrements('id')->primary()->change();

// インデックス削除
$table->char('postal_code', 10)->unique(false)->change();
```

## 浮動小数点タイプについて
　カラムタイプの種類である`double`型と、カラム指定の`float`は全てのデータベースで一貫性があるようになった。
 
カラムの型が`double`であるものに関して、合計桁数と小数点以下の桁数を含めない`DOUBLE`同等のカラムを作成するようになった。

``` PHP:double型の書き方
$table->double('amount');
```

`float`カラム型に関して、合計桁数と小数点以下の桁数を指定しない`FLOAT`相当の列を作成するようになった。オプションの`precision`を指定することで精度を決定することができる。

``` PHP:float型の書き方
$table->float('amount', precision: 53);
```

#### 参考文献
> [Laravel 11.x アップグレードガイド](https://readouble.com/laravel/11.x/ja/upgrade.html)
> [Laravel11の変更点と新機能をご紹介：ファイルが減ってスッキリしました！](https://biz.addisteria.com/laravel11/)