Laravel 11🐲🐉がリリースされたのだ🎉【Laravel 11 新機能・変更点】

https://twitter.com/taylorotwell/status/1767558463431856590

Laravel 11がきました！ぺちぱーとララベラー歓喜！新機能を紹介します

https://laravel.com/docs/11.x/releases

# Laravel 11のインストール
Laravel 11はPHP8.2以上が必要です
```bash
composer create-project laravel/laravel:^11.0 example-app
cd example-app
```

# 合理化されたアプリケーション構造

Laravel 11 では、既存のアプリケーションに変更を加えることなく、新しいLaravel アプリケーション向けに合理化されたアプリケーション構造が導入されています。新しいアプリケーション構造は、Laravel 開発者がすでによく知っている概念の多くを保持しながら、より無駄がなく、より現代的なエクスペリエンスを提供することを目的としています。以下では、Laravel の新しいアプリケーション構造のハイライトについて説明します。

## アプリケーションのブートストラップ ファイル

この`bootstrap/app.php`ファイルは、コードファーストのアプリケーション構成ファイルとして復活しました。このファイルから、アプリケーションのルーティング、ミドルウェア、サービス プロバイダー、例外処理などをカスタマイズできます。このファイルは、以前はアプリケーションのファイル構造全体に散在していたさまざまな高レベルのアプリケーション動作設定を統合します。

```php
return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();
```

## サービスプロバイダー

デフォルトの Laravel アプリケーション構造には 5 つのサービスプロバイダーが含まれていますが、Laravel 11 には 1 つのサービスプロバイダーのみが含まれていますAppServiceProvider。以前のサービス プロバイダーの機能は に組み込まれておりbootstrap/app.php、フレームワークによって自動的に処理されるか、アプリケーションの に配置される場合がありますAppServiceProvider。

たとえば、イベント検出がデフォルトで有効になり、イベントとそのリスナーを手動で登録する必要がほとんどなくなりました。ただし、イベントを手動で登録する必要がある場合は、 で簡単に登録できますAppServiceProvider。同様に、以前に に登録したルート モデル バインディングまたは認証ゲートも、 にAuthServiceProvider登録される可能性がありますAppServiceProvider。

## 設定ファイル

環境変数の使用が拡張され、.env.example新しい Laravel アプリケーションに含まれるファイルにプレースホルダーが追加されました。このため、ほぼすべてのコア フレームワーク機能は.env、個別の構成ファイルではなくアプリケーションのファイルを介して構成できます。したがって、configデフォルトではディレクトリには構成ファイルが含まれなくなりました。

代わりに、新しい Artisan コマンドを使用して構成ファイルを公開できますconfig:publish。これにより、カスタマイズしたい構成ファイルのみを公開できます。

```bash
php artisan config:publish
```

もちろん、フレームワークのすべての構成ファイルを簡単に公開することもできます。

```bash
php artisan config:publish --all
```

## オプトイン API とブロードキャスト ルーティング

およびRoute ファイルはapi.php、channels.php多くのアプリケーションではこれらのファイルを必要としないため、デフォルトでは存在しなくなりました。代わりに、単純な Artisan コマンドを使用して作成することもできます。

```bash
php artisan install:api
 
php artisan install:broadcasting
```

## ミドルウェア

以前は、新しい Laravel アプリケーションには 9 つのミドルウェアが含まれていました。これらのミドルウェアは、リクエストの認証、入力文字列のトリミング、CSRF トークンの検証などのさまざまなタスクを実行しました。

Laravel 11 では、これらのミドルウェアはフレームワーク自体に移動されているため、アプリケーションの構造がかさばることはありません。これらのミドルウェアの動作をカスタマイズする新しいメソッドがフレームワークに追加されており、アプリケーションのbootstrap/app.phpファイルから呼び出すことができます。

```php
->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(
        except: ['stripe/*']
    );
 
    $middleware->web(append: [
        EnsureUserIsSubscribed::class,
    ])
})
```

すべてのミドルウェアはアプリケーションの を介して簡単にカスタマイズできるためbootstrap/app.php、別個の HTTP 「カーネル」クラスの必要性がなくなりました。

## スケジュール設定

新しいScheduleファサードを使用すると、スケジュールされたタスクをアプリケーションのroutes/console.phpファイルで直接定義できるようになり、別個のコンソール「カーネル」クラスが不要になります。

```php
use Illuminate\Support\Facades\Schedule;
 
Schedule::command('emails:send')->daily();
```

## 例外処理


bootstrap/app.phpルーティングやミドルウェアと同様に、例外処理を個別の例外ハンドラー クラスではなくアプリケーションのファイルからカスタマイズできるようになり、新しい Laravel アプリケーションに含まれるファイル全体の数が削減されます。

```php
->withExceptions(function (Exceptions $exceptions) {
    $exceptions->dontReport(MissedFlightException::class);
 
    $exceptions->reportable(function (InvalidOrderException $e) {
        // ...
    });
})
```

## アプリケーションのデフォルト

databaseデフォルトでは、新しい Laravel アプリケーションは、Laravel のセッション、キャッシュ、キューのドライバーだけでなく、データベース ストレージにも SQLite を使用します。これにより、追加のソフトウェアをインストールしたり、追加のデータベース移行を作成したりすることなく、新しい Laravel アプリケーションを作成した後すぐにアプリケーションの構築を開始できます。

さらに、時間の経過とともに、databaseこれらの Laravel サービスのドライバーは、多くのアプリケーション コンテキストで本番環境で使用できるほど十分に堅牢になりました。したがって、ローカル アプリケーションと運用アプリケーションの両方に賢明で統一された選択肢を提供します。

# ララベルリバーブ

Laravel Reverb は、超高速でスケーラブルなリアルタイム WebSocket 通信を Laravel アプリケーションに直接もたらし、Laravel Echo などの Laravel の既存のイベント ブロードキャスト ツール スイートとのシームレスな統合を提供します。

```bash
php artisan reverb:start
```

さらに、Reverb は Redis のパブリッシュ/サブスクライブ機能を介した水平スケーリングをサポートしており、単一の高需要アプリケーションをサポートする複数のバックエンド Reverb サーバー全体に WebSocket トラフィックを分散できます。

Laravel Reverb の詳細については、Reverb の完全なドキュメントを参照してください。

# 1 秒あたりのレート制限

Laravel は、HTTP リクエストやキューに入れられたジョブのレート リミッターを含む、すべてのレート リミッターに対して「1 秒あたり」のレート制限をサポートするようになりました。以前は、Laravel のレート リミッターは「1 分あたり」の粒度に制限されていました。

```php
RateLimiter::for('invoices', function (Request $request) {
    return Limit::perSecond(1);
});
```

Laravel でのレート制限の詳細については、レート制限のドキュメントを参照してください。

# ヘルスルーティング

新しいLaravel 11アプリケーションにはhealthルーティングディレクティブが含まれており、サードパーティのアプリケーションヘルスモニタリングサービスやKubernetesなどのオーケストレーションシステムによって呼び出される単純なヘルスチェックエンドポイントを定義するようLaravelに指示します。デフォルトでは、このルートは次の場所で提供されます/up。

```php
->withRouting(
    web: __DIR__.'/../routes/web.php',
    commands: __DIR__.'/../routes/console.php',
    health: '/up',
)
```

このルートに対して HTTP リクエストが行われると、Laravel はDiagnosingHealthイベントも送出して、アプリケーションに関連する追加のヘルスチェックを実行できるようにします。

# 正常な暗号化キーのローテーション

Laravel はアプリケーションのセッション Cookie を含むすべての Cookie を暗号化するため、基本的に Laravel アプリケーションへのすべてのリクエストは暗号化に依存します。ただし、このため、アプリケーションの暗号化キーをローテーションすると、すべてのユーザーがアプリケーションからログアウトされます。また、以前の暗号鍵で暗号化されたデータは復号できなくなります。

Laravel 11 では、環境変数を使用してアプリケーションの以前の暗号化キーをカンマ区切りのリストとして定義できますAPP_PREVIOUS_KEYS。

値を暗号化するとき、Laravel は常に環境変数内にある「現在の」暗号化キーを使用しますAPP_KEY。値を復号化するとき、Laravel は最初に現在のキーを試行します。現在のキーを使用した復号化が失敗した場合、Laravel はキーの 1 つで値を復号化できるまで、以前のすべてのキーを試します。

この正常な復号化のアプローチにより、暗号化キーがローテーションされた場合でも、ユーザーはアプリケーションを中断することなく使用し続けることができます。

Laravel での暗号化の詳細については、暗号化に関するドキュメントを参照してください。

# 即時検証

Laravel Prompts は、プレースホルダー テキストや検証などのブラウザーのような機能を備えた、美しくユーザーフレンドリーなフォームをコマンドライン アプリケーションに追加するための PHP パッケージです。

Laravel プロンプトは、クロージャーを介した入力検証をサポートしています。

```php
$name = text(
    label: 'What is your name?',
    validate: fn (string $value) => match (true) {
        strlen($value) < 3 => 'The name must be at least 3 characters.',
        strlen($value) > 255 => 'The name must not exceed 255 characters.',
        default => null
    }
);
```

ただし、多くの入力や複雑な検証シナリオを扱う場合、これは面倒になる可能性があります。したがって、Laravel 11 では、プロンプト入力を検証するときに Laravel のバリデーターの機能を最大限に活用できます。


```php
$name = text('What is your name?', validate: [
    'name' => 'required|min:3|max:255',
]);
```

# キュー相互作用のテスト

以前は、キューに入れられたジョブが解放、削除されたか、手動で失敗したかをテストしようとするのは面倒で、カスタム キューのフェイクとスタブを定義する必要がありました。ただし、Laravel 11 では、次のメソッドを使用してこれらのキューの対話を簡単にテストできますwithFakeQueueInteractions。


```php
use App\Jobs\ProcessPodcast;
 
$job = (new ProcessPodcast)->withFakeQueueInteractions();
 
$job->handle();
 
$job->assertReleased(delay: 30);
```

キューに入れられたジョブのテストの詳細については、キューのドキュメントを参照してください。

# 新しいアーティザンコマンド

新しいアーティザン コマンドが追加され、クラス、インターフェイス、特性を迅速に作成できるようになりました。

## php artisan make:class

```bash
$ php artisan make:class Hoge

   INFO  Class [app/Hoge.php] created successfully.
```

```php:example-app/app/Hoge.php
<?php

namespace App;

class Hoge
{
    /**
     * Create a new class instance.
     */
    public function __construct()
    {
        //
    }
}
```

## php artisan make:enum

```bash
$ php artisan make:enum Hoge

   INFO  Enum [app/Hoge.php] created successfully.
```

```php:example-app/app/Hoge.php
<?php

namespace App;

enum Hoge
{
    //
}
```

## php artisan make:interface

```bash
$ php artisan make:interface Hoge

   INFO  Interface [app/Hoge.php] created successfully.
```

```php:example-app/app/Hoge.php
<?php

namespace App;

interface Hoge
{
    //
}
```

## php artisan make:trait

```bash
$ php artisan make:trait Hoge

   INFO  Trait [app/Hoge.php] created successfully.
```


```php:example-app/app/Hoge.php
<?php

namespace App;

trait Hoge
{
    //
}
```


# まとめ

いかがでしたか?(🤛

3/7~3/9 ぺちぱーの会議があります。もしよければぜひ参加してほしいのだ

https://phperkaigi.jp/2024/

リーよ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/1bd10a3b-58ae-3540-45ea-1b25850f897a.png)