Laravel10からの変更点と、Laravel11の新機能をお見せしていきます。感想をひとことでまとめると「ファイルが減って、すっきりした!」です。
どうスッキリしたか、一目でお伝えすると、下記のような感じです。以前と比べて、ファイル数が69個ほど減ったとのこと。
【Laravel10とLaravel11の比較】
Laravelの作者Taylor氏によると、
Laravel11の目的は、より無駄なく、よりミニマルに、よりモダンにすること(leaner more minimal more modern feel)
具体的にどう変わり、どんな新機能が搭載されたのか、お伝えしていきますね。
【動画編はこちら♪ 併せてご覧ください。】
Laravel10からの変更点
まずは変更点からお伝えします。わたしが「これはインパクト大きい!」と感じた順番にお伝えしていきます。
Laravel11からはPHP8.2が必要
まず、Laravel11からは、PHPは8.2以上が必要になります。
ちなみにLaravel10では、PHPは8.1以上でOKでした。着々と上がっていますね。
デフォルトのデータベース管理システムがSQLiteに
デフォルトのデータベース管理システムがSQLiteになります。
グローバルコマンドでLaravelをインストールした場合には、最初にデータベース含め、各種設定を選べます。
1 |
composer global require laravel/installer |
1 |
laravel new projectname |
ただし、ディレクトリ指定でLaravelプロジェクトを新規作成した場合、デフォルトのデータベース管理システムはSQLiteになります。.envファイルのDB_CONNECTIONには、これまでmysqlが設定されていましたが、Laravel11ではsqliteが設定されます。
MariaDBやMySQLなど他のデータベース管理システムを使いたい場合には、修正が必要です。下記記事を参考にしてください。
なお、Laravel Sailを使ってプロジェクトを作ると、これまでどおりMySQLが入ります
Laravel11ではミドルウェアが消えた!!
Laravel11では、色々なファイルが非表示になりましたが、インパクトが大きいものとしては、デフォルトでミドルウェアがなくなった点です。
【app/Http】
これまでapp/Http/Middlewareには、デフォルトで9個のmiddlewareファイルがありました。Laravel11では、フォルダごと、ごっそりmiddlewareが消えています。
でも、安心してください。はいていますよ!
ではなく。。。安心してください。ミドルウェアは使えますよ!
ミドルウェアファイルは、単に、デフォルトで表示されていないだけで、これまでどおり使えます。
なぜミドルウェアを非表示にしたのか。Taylor氏の言葉をまとめると、次のとおりです。
多くのデフォルトのミドルウェア、たとえば、クッキーをencryptするmiddlewareなどは、ユーザーが手をくわえることはほとんどない。それなら、必要な時だけ簡単にカスタマイズできるようにできれば良い。
たしかに、デフォルトのミドルウェアをカスタマイズする必要性って、少ないですよね。非表示にしたほうがスッキリします。
ミドルウェアをどのように登録するかは、下記記事にまとめたのでご覧ください。ミドルウェアを登録する場所も変わり、bootstrap/app.phpになります。
ServiceProviderが5個から1個に
デフォルトのServiceProviderも大幅に減りました。Laravel10ではServiceProviderは5個ありましたが、Laravel11ではAppServiceProvider.php1個のみです。
わりとよく使う印象があるRouteServiceProvider.phpもなくなってしまいました。ただ、RouteServiceProvider.phpにあったコードに相当するものは、bootstrap/app.phpの中に入っています。
【bootstrap/app.php】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php use Illuminate\Foundation\Application; use Illuminate\Foundation\Configuration\Exceptions; use Illuminate\Foundation\Configuration\Middleware; return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', // api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', // channels: __DIR__.'/../routes/channels.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware) { // }) ->withExceptions(function (Exceptions $exceptions) { // })->create(); |
routes/api.phpとroutes/channels.php用のルートはデフォルトでは、コメントアウトされています。次項で説明するコマンドを使ってこれらのルートを有効にすると、上記のコメントアウトも外れます。
これまでbootstrap/app.phpはあまり使う機会はありませんでしたが、今後は、利用することが増えそうですね。
なお、これまでGateを登録していたAuthServicePrividerもなくなりましたが、今後は、AppServiceProvider.phpに登録できます。
routesからapiとconsoleが消えている
routesファイルの中もスッキリしました。api.phpとchannels.phpファイルがなくなっています。
【routes】
ただ、コマンドを実行するとすぐに戻せます。api.phpとchannels.phpを有効にするコマンドは、それぞれ下記のとおりです。
【api.php復活コマンド】
1 |
php artisan install:api |
【channels.php復活コマンド】
1 |
php artisan install:broadcasting |
configフォルダも減りました。
configフォルダの中身も15個から10個になりました。hashing.phpやsanctum.phpなどがなくなっています。
編集が必要なときは、vendor:publishコマンドを実行すると、configファイルを作れます。
1 |
php artisan config:publish |
(コマンド実行後、パブリッシュしたいファイルを選びます)
パブリッシュしたconfigファイルを編集する際には、更新が必要な箇所のみ残しておけば良いようです。特に記載がない場合には、デフォルト値が使われるとのこと。
つまり、コードの量を少なくしておけます。これも、スッキリスリム化のコンセプトに沿っていますね。
マイグレーションファイルもコンパクトに
Laravel11では、マイグレーションファイルもコンパクトになっています。
Laravel10では、usersテーブルなど、デフォルトで4個のマイグレーションファイルが入っていました。
Laravel11では、ひとつのファイルに複数のテーブル作成用のコードが入っています。デフォルトで作成されるテーブルも少し変わっています。
【Laravel11のデフォルトのdatabase/migrations】
【デフォルトで作成されるテーブル】
Consoleもない
app/Consoleもデフォルトではなくなっていました。こちらは、コマンド処理などの際に使いますが、使わないケースも多いため、デフォルトでは非表示になったのだと考えられます。
スケジューリング処理を行い時は、routes/console.phpに直接記述ができます。下記記事を参考にしてください。
Controller.phpLaravel11ではコントローラが何も継承しない
Laravel10では、デフォルトで設定されているApp\Http\Controllers\Controller
クラスには、色々な機能を提供するトレイトが含まれていました。
Laravel11では、この部分がスッキリしています。
【Laravel11のController.php】
1 2 3 4 5 6 7 8 |
<?php namespace App\Http\Controllers; abstract class Controller { // } |
Laravel11の新機能
ここまで変更点を見てきました。次に新機能を見ていきます。
変更点より、新機能のほうがワクワクしますね。
Webアプリによって使う可能性がある機能は異なります。今後の開発に何が使えそうか、ざっとご覧になってみてください。
Laravel Reverb: リアルタイム機能をより簡単に実装
リアルタイムの通信が必要なLaravelアプリケーションにおいて、高速かつスケーラブルなWebSocketサービスを提供します。
詳しくは、下記の公式ドキュメントをご覧ください。
Per-Second Rate Limiting:より細かいレートリミットが可能に
以前は、Laravelのレートリミットは、per-minute(1分ごと)までが可能でした。Laravel11からは、per-second(1秒ごと)の設定が可能になります。つまり秒単位でリクエスト数を制限できるようになります。
1 2 3 |
RateLimiter::for('invoices', function (Request $request) { return Limit::perSecond(1); }); |
高頻度でアクセスが行われるAPIや、短時間に多くのリクエストを処理する必要があるアプリケーションに有益な機能です。詳しくは、下記の公式ドキュメントをご覧ください。
Health Routing: ヘルスチェック機能
ドメイン/up を行うと、ヘルスチェック画面が表示されます。
非表示にしたい場合は、bootstrap/app.php内のhealth: ‘/up’ をコメントアウトします。
よりスムーズな暗号化キーのローテーション(交換)機能
アプリケーションの暗号化キーを更新しても、ユーザーがログアウトされることなく、また、以前のキーで暗号化されたデータも復号化できるようになります。
APP_PREVIOUS_KEYS
環境変数を通じて、アプリケーションの以前の暗号化キーをカンマ区切りのリストとして定義することができます。
セキュリティを高めるために定期的にキーを更新する必要がある場合に便利です。詳しくは、下記の公式ドキュメントをご覧ください。
プロンプトバリデーション
コマンドラインアプリケーション向けのフォームを簡単に追加できる「Laravel Prompts」というPHPパッケージが導入されました。
コマンドラインインターフェース(CLI)でユーザーフレンドリーなインタラクティブな入力フォームを提供します。
詳しくは、下記の公式ドキュメントをご覧ください。
キューのインタラクションテスト
Laravel 11では、withFakeQueueInteractions
メソッドを使用してキューのインタラクションを簡単にテストできるようになりました。
キューを利用したアプリケーションの信頼性と品質を向上させることができます。詳しくは、下記の公式ドキュメントをご覧ください。
新たなartisanコマンド
クラス、enum、インターフェース、トレイトを新規作成するための新たなコマンドが追加されました。これらのファイルの新規作成が、ちょっと便利になります♪
1 2 3 4 |
php artisan make:class php artisan make:enum php artisan make:interface php artisan make:trait |
モデルのcastsが静的プロパティからメソッドに変更
castsは、これまで静的プロパティだったのが、メソッドとなるようです。Laravel10では、Userモデルファイルには、デフォルトで下記のようにcastsが入っていました。
【User.php(Laravel10)】
1 2 3 4 |
protected $casts = [ 'email_verified_at' => 'datetime', 'password' => 'hashed', ]; |
Laravel11では、次のようにcastsが入っています。
【User.php(Laravel11)】
1 2 3 4 5 6 7 |
protected function casts(): array { return [ 'email_verified_at' => 'datetime', 'password' => 'hashed', ]; } |
関数になることで処理の追加などが可能になり、自由度が上がりそうですね。
onceヘルパー:リクエスト中に一度だけ実行される処理の結果をキャッシュ
onceヘルパーは与えられたコールバックを実行し、その結果をリクエストの期間中メモリにキャッシュします。同じコールバックを使用してonce
関数を後続で呼び出した場合、以前にキャッシュされた結果が返されます。
同一リクエスト内で同じ結果を複数回取得する必要があるものの、その処理を繰り返し実行することでパフォーマンスが低下することを避けたい場合に便利です。
詳しくは、下記の公式ドキュメントをご覧ください。
メモリ内データベースを使用したテストのパフォーマンス向上
テスト中に:memory:
SQLiteデータベースを使用する際のパフォーマンスが大幅に向上しました。
MariaDBのサポート向上
これまではLaravelのMySQLドライバーを通じてMariaDBを使用することができました。Laravel 11では専用のMariaDBドライバーが含まれています。
記事前半でご紹介したとおり、グローバルコマンドでLaravelをインストールした場合には、最初にデータベース含め、各種設定を選べます。MariaDBの選択も可能です。
1 |
composer global require laravel/installer |
1 |
laravel new projectname |
.envに言語設定追加
.envファイルの中に、言語設定が入っています。
【.env】
1 2 3 |
APP_LOCALE=en APP_FALLBACK_LOCALE=en APP_FAKER_LOCALE=en_US |
configにはこのようになっています。
【config/app.php】
1 2 3 4 5 |
'locale' => env('APP_LOCALE', 'en'), 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), |
.env側で言語設定があれば、そちらが反映されます。なければconfig側の設定が有効になります。
本記事の主な参考元
今回の記事を書くにあたり、Laravelの公式ドキュメントと、2023年7月と2024年2月のLaravelのカンファレンス(Laracon)におけるTaylor Otwell氏(Laravelの生みの親)による講演の動画を参考にしました。
さらに自身の環境で検証を行った結果を記事にしました。
動画を通じて、なぜこのようなスリム化に至ったのか等、Laravelのコンセプトを感じ取れます。
ご興味あれば、下記、ご視聴ください。見ごたえあります。ただ結構長い動画なので、お時間があるときに見てくださいね。
【2023年7月Laracon】
【2024年2月Laracon】
なお2023年7月の動画では、Laravel FolioやLaravel Voltといった新しいライブラリの紹介もありました。これらも、なかなか便利な機能です。別記事にまとめているので、ご興味あれば、併せて参考にしてください。
【Laravel Folio】ルーティングが不要になる機能です。
【Laravel Volt】Vue.jsのように、Livewireのコードを1つのファイルに集約できます。
使ってみましたが、両方とも、コードやファイルの量を減らせる便利な機能です。特に、Laravel Voltは気に入りました♪
さいごに
Laravel11は、ひとことでいうと、Taylor氏の狙いどおり「スッキリ★スリム化」が実現されたなぁ、という印象です。
デフォルトの設定を変える機会が少ないファイルは非表示になり、見やすくなった気がします。ただ、最初は慣れるのが大変ですね^^;
なお、わたしのほうではLaravel学習サイトも運営しております。学習サイトは、Laravelの基本の使い方を学びつつ、フォーラムサイトを作っていける実践的な内容です。
学習サイトでは、最新のLaravel11版のテキストもご用意しています^^
基礎編は無料です。ご興味あれば、下記をクリックして案内ページを見てみてくださいね。
*学習サイトではLaravel8, Laravel9, Laravel10のテキストもご覧になれます。
コメント
Laravel11、色々と非表示になったんですね。むしろLaravelを使う人ってミドルウェアだったり、apiだったりを使う人じゃないのかな?と感じてしまいます。なんとなくブログ作るとかなら、Laravelではなく、安直にWordPressでいいのではないかと思ったりです。PHP教育のためにたまに読んでいるので記事ありがとうございます。
そうですよね。
分かりやすさと、カスタマイズのしやすさ、両方のバランスをとるのは難しそうですが。
コメントありがとうございます^^