Laravel8が2020年9月8日にリリースされました。
Laravel7との違い、便利な新機能情報、旧バージョンのサポートなど、まとめました。
下記の公式ブログに書かれた項目はすべて網羅しております。
実体験レポートも掲載しておりますので、Laravelユーザーの方、使ってみようかなと思っている方は、参考にしてください。
- Laravel8の新機能
- Laravel Jetstream :新たな認証機能追加
- Models Directory :モデルファイルの場所変更
- Models Factory Classes :ダミーデータ作成がより便利に
- Migration Squashing : 不要なマイグレーションファイルの処理
- Job Batching :ジョブのバッチ機能追加
- Rate Limitingの改善 :アクセス制限などが便利に
- Improved Maintenance Mode :メンテナンスモード改良
- Closure Dispatch / Chain :失敗したときの処理
- Dynamic Blade Components :コンポーネントを便利に指定
- Event Listener Improvements :イベントリスナー処理の改良
- Time Testing Helpers :新たな時間変更の関数が利用可能に
- Artisan serve Improvements: Artisan Serveコマンドの改良
- Tailwind Pagination Views:ページネーションビュー変更
- Routing Namespace Updates:ルートファイルの名前空間の変更
- Laravelの旧バージョンのサポート
Laravel8の新機能
公式ファイルに書かれていたアップデート項目は、下記の通りです。
私の目線ですが、影響が多きそうな項目にだけ★をつけておきました。
すべてチェックするのが面倒な場合には、★部分だけご確認ください。
- Laravel Jetstream :新たな認証機能追加
- Models Directory :モデルファイルの場所変更 ★
- Models Factory Classes :ダミーデータ作成がより便利に
- Migration Squashing : 不要なマイグレーションファイルの処理 ★
- Job Batching :ジョブのバッチ機能追加
- Rate Limitingの改善 :アクセス制限などが便利に
- Improved Maintenance Mode :メンテナンスモード改良
- Closure Dispatch / Chain :失敗したときの処理
- Dynamic Blade Components :コンポーネントを便利に指定
- Event Listener Improvements :イベントリスナー処理の改良
- Time Testing Helpers :新たな時間変更の関数が利用可能に
- Artisan serve Improvements: Artisan Serveコマンドの改良
- Tailwind Pagination Views:ページネーションビュー変更
- Routing Namespace Updates:ルートファイルの名前空間の変更 ★
Laravel Jetstream :新たな認証機能追加
ログイン・認証機能です。
使用する際には、コンポーザーを使ってインストールします。
1 |
composer require laravel/jetstream |
このあと、LivewireまたはInertiaのどちらかのライブラリを選択します。
LivewireはBlade、InertiaはVue.jsを使用します。
1 2 3 4 5 |
php artisan jetstream:install livewire npm install && npm run dev php artisan migrate |
ユーザーログイン・登録・メール認証・2段階認証・セッション管理などを便利にしてくれる機能ながら、どうも使いにくいという声もあり。
とりあえずはこれまでおりの方法を使っていこうとおもいます。
Models Directory :モデルファイルの場所変更
これまでモデルファイルはappフォルダの直下にありました。
コントローラーやビューファイルはちゃんと「Controller」フォルダ、「View」フォルダに入っているのにどうして?
って感じしますよね。
同じように感じたユーザーが多かったようで、今回のアップデートにより、モデルファイルも app/Modelsフォルダの中に格納されるようになりました。
Models Factory Classes :ダミーデータ作成がより便利に
Laravelには、ダミーデータを作れる機能があります。
モデルファクトリを使うと、大量のダミーデータを作ることができます。
今回のバージョンアップで、モデルファクトリを非常に便利に作れるようになりました。
1 2 3 |
use App\Models\User; User::factory()->count(50)->create(); |
特にリレーションがある場合に、便利です。
たとえばuserモデルがpostsモデルとの間にリレーションがある場合、下記のように【hasPosts】という関数が使えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php namespace Database\Factories; use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Str; class UserFactory extends Factory { /** * The name of the factory's corresponding model. * * @var string */ protected $model = User::class; /** * Define the model's default state. * * @return array */ public function definition() { return [ 'name' => $this->faker->name, 'email' => $this->faker->unique()->safeEmail, 'email_verified_at' => now(), 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 'remember_token' => Str::random(10), ]; } }<code class=" language-php"> |
なおLaravel8でダミーデータを作成する方法については、こちらの記事に詳細を解説しています。
Migration Squashing : 不要なマイグレーションファイルの処理
マイグレーションを度々実行すると、マイグレーションファイルの量が増えていきますよね。
Laravel 8では、 マイグレーションファイルを圧縮保存するコマンドができました。
1 |
php artisan schema:dump |
コマンドを実行すると、database/shemaディレクトリにshemaファイルができ、このなかにマイグレーションのデータが格納されます。
マイグレーション実行時には最初にshcemaファイルのマイグレーションを実行します。
こうすることで、処理の高速化が可能に。
実行時に既存のマイグレーションファイルを削除したい場合は、–prune を付けます。
1 |
$ php artisan schema:dump --prune |
Job Batching :ジョブのバッチ機能追加
then, catch, finally の三段階で処理を指定したりもできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
use App\Jobs\ProcessPodcast; use App\Podcast; use Illuminate\Bus\Batch; use Illuminate\Support\Facades\Batch; use Throwable; $batch = Bus::batch([ new ProcessPodcast(Podcast::find(1)), new ProcessPodcast(Podcast::find(2)), new ProcessPodcast(Podcast::find(3)), new ProcessPodcast(Podcast::find(4)), new ProcessPodcast(Podcast::find(5)), ])->then(function (Batch $batch) { // All jobs completed successfully... })->catch(function (Batch $batch, Throwable $e) { // First batch job failure detected... })->finally(function (Batch $batch) { // The batch has finished executing... })->dispatch(); return $batch->id; |
どこかでうまくいかなくても処理を継続させることも可能。
1 2 3 4 5 |
$batch = Bus::batch([ // ... ])->then(function (Batch $batch) { // 全ジョブが成功して完了した })->allowFailures()->dispatch(); |
Rate Limitingの改善 :アクセス制限などが便利に
Laravelでは、RouteにURLにアクセスしたときの処理を記述します。
Rate limitingを使えば、このRouteで設定されたアクセスにレート制限をかけることができます。
たとえばIPアドレスごとに1分間に100回のアクセスを可能にすることも可能。
1 2 3 4 5 |
RateLimiter::for('uploads', function (Request $request) { return $request->user()->vipCustomer() ? Limit::none() : Limit::perMinute(100)->by($request->ip()); });<code class=" language-php"> |
レート制限を超えたときのレスポンスも独自に設定できます。
Improved Maintenance Mode :メンテナンスモード改良
これまでも php artisan down とするとメンテナンスモードにできました。
今回はここに secretオプションを使って、メンテナンス中もページを見れるトークンを特定できるようになりました。
1 |
php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515" |
工事中の場所を迂回してサイトにアクセスするような感じですね。
Closure Dispatch / Chain :失敗したときの処理
新たな catchメソッドを使うことで、もしClosure処理が無事行えなかった場合に実行する処理を設定できます。
1 2 3 4 5 6 7 |
use Throwable; dispatch(function () use ($podcast) { $podcast->publish(); })->catch(function (Throwable $e) { // This job has failed... }); |
Dynamic Blade Components :コンポーネントを便利に指定
コンポーネントファイルとは、テンプレートファイルのようなものです。
コンポーネントを使うとき、場合によってはどのコンポーネントが使われるか判断できない場合があります。
下記のように【dynemic-component】を使って指定しておけば、実行時の変数や値をもとにコンポーネントが受け渡されます。
1 |
<x-dynamic-component :component="$componentName" class="mt-4" /><code class=" language-php"> |
Event Listener Improvements :イベントリスナー処理の改良
イベントリスナー機能を使う際、Laravelがそのタイプのイベントをリスナーが処理するか、調べられるようになりました。
1 2 3 4 5 6 |
use App\Events\PodcastProcessed; use Illuminate\Support\Facades\Event; Event::listen(function (PodcastProcessed $event) { // }); |
Time Testing Helpers :新たな時間変更の関数が利用可能に
Time Testing Helpersが使えるようになりました。
Ruby on Railsの機能だったようですね。
現在時刻をもとに、設定した時間に変更して、テストができる機能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public function testTimeCanBeManipulated() { // Travel into the future... $this->travel(5)->milliseconds(); $this->travel(5)->seconds(); $this->travel(5)->minutes(); $this->travel(5)->hours(); $this->travel(5)->days(); $this->travel(5)->weeks(); $this->travel(5)->years(); // Travel into the past... $this->travel(-5)->hours(); // Travel to an explicit time... $this->travelTo(now()->subHours(6)); // Return back to the present time... $this->travelBack(); } |
Artisan serve Improvements: Artisan Serveコマンドの改良
PHP Artisan Serveコマンドを実行すると、自動で.envファイルの変更を読み込んでくれるようになりました。
Tailwind Pagination Views:ページネーションビュー変更
Laravelのページネーターは、Thaiwindページネーションビューをデフォルトで使用するようになりました。
Bootstrap3と4のビューもこれまでどおり利用可能です。
Routing Namespace Updates:ルートファイルの名前空間の変更
以前はRouteServiceProviderファイルに、 コントローラーのパスがデフォルトで入っていました。
そのため、ルートファイルに記入する必要はありませんでした。
Laravel 8ではデフォルトではデフォルトでこの設定が無効になっています。そのため、ルートファイルにコントローラーのパスの記述が必要です。
1 2 3 |
use App\Http\Controllers\UserController; Route::get('/users', [UserController::class, 'index']); |
これまでの方法がよければ、RouteServiceProviderファイルの設定を変えれば、毎回ルートファイルにパスを入れる必要はなくなります。
処理方法は、こちらで解説しています。
Laravelの旧バージョンのサポート
Laravelは6か月ごとにバージョンを更新します。
新しいバージョンが出たら、古いバージョンのサポートはどうなるのか?
しばらくはサポートを継続してくれますが、期限付きです。
あまり古いバージョンは更新していったほうが良さそうですね。
なおLaravel バージョン6はLTS版(長期間サポート版)であるため、サポート期間が長めに設定されています。
!2021年2月追記:今後のバージョンはアップは1年に1度ペースになるとのこと!
詳しくはこちらをどうぞ。