- Laravel8がリリース
- サポートポリシーについて
- Laravel8の新機能や変更点
- Laravel Jetstream
- Models Directory
- Model Factory Classes
- migration squashing
- job batching
- improved rate limiting
- Improved Maintenance Mode
- Closure Dispatch / Chain
- dynamic Blade components
- Event Listener Improvements
- time testing helpers
- Artisan serve Improvements
- Tailwind pagination views
- Routing Namespace Updates
- 所感
Laravel8がリリース
2020年9月8日にLaravel8がリリースされました!!
使用してみる前にまずは変更点等々の調査としてRelease Notesを読んでいきます。
コードは結構省いて変わっている部分のみを基本的には記述しているので詳しくはRelease Notesを参照してください。
Release Notesは以下にあります。

サポートポリシーについて
バージョンをあげるかどうかにも関わるので、まずはサポートポリシーについてです。
過去バージョン(6以降)のサポートポリシーですが以下になります。
バージョン | リリース日 | バグ修正 | セキュリティ対応 |
6(LTS) | 2019年9月3日 | 2021年9月3日 | 2022年9月3日 |
7 | 2020年3月3日 | 2020年10月6日 | 2021年3月3日 |
8 | 2020年9月8日 | 2021年4月6日 | 2021年9月8日 |
Laravel6が2年間のバグ修正と3年間のセキュリティ対応があるので、今のところ何か作るとしたらLaravel6で作るのが妥当ですね。
ちなみに、LTSでない場合のリリースは6ヵ月のバグ修正と1年間のセキュリティ対応です。
すでにLaravel7で作成している場合は、バグ対応が終了するので可能であればLaravel8への移行をした方が良さそうです。
Laravel8の新機能や変更点
Laravel Jetstream
ログイン、登録、メールチェック、二段階認証、セッション管理、Laravel Sanctum(https://readouble.com/laravel/7.x/ja/sanctum.html)のサポート、チーム管理ができるようです。
LaravelでもSPA使用する機会が多いので良さそう。これは試したい。
Models Directory
デフォルトのmodelsの場所がapp/modelsに変更されました。このバージョンからわざわざ作らなくてもよくなります。modelを探す時はまずはapp/modelsディレクトリの存在確認、なければapp以下となるようなので、すでにapp以下にmodel が作られているプロジェクトを移行する時はディレクトリがなければ、移動しなくても問題なさそう。
Model Factory Classes
Factoryがクラス化されました。
$factory->define(User::class, function(Faker $faker)
{
return [
'name' => $faker->name
]
})
のように書いていたのが
class UserFactory extends Factory
{
protected $model = User::class;
public function definition()
{
return [
'name' => $this->faker->name,
];
}
}
こんな感じでFactoryクラスを継承して書くことができるようなりました。
使用する時もmodelに紐づいてくれて
User::factory()->count(50)->create();
と書くことができます。
クラスになったことによって、モデル内のメソッドによって作成するデータの状態を変更できます。
今までのfactoryでは値を渡していたのでこれは業務に沿った形がわかりやすくなって良さそうです。
以下のようなメソッドがUser Modelに定義してあるとすると
public function suspended()
{
return $this->state([
'account_status' => 'suspended',
]);
}
クラスベースなので
User::factory()->count(5)->suspended()->create();
で実際に使用するModelのメソッドを使ってデータを作成することができる。
また、リレーションがmodelに定義してあれば、リレーション先のデータ作成に関してもシンプルにかけるようです。
$users = User::factory()
->hasPosts(3, [
'published' => false,
])
->create();
シンプルで便利。
migration squashing
開発が進んで溜まってくmigrationファイル(わかる。。)を、単一のSQLファイルにまとめることができるようになりました(使用しているDBがMySQLまたはPostgreSQLであれば)。
php artisan schema:dump
// Dump the current database schema and prune all existing migrations...
php artisan schema:dump --prune
SQLファイルはdatabase/schemaに作成されるようです。
何もmigrationファイルが実行されていない状態であれば、migrationファイル実行前にこの吐き出したschemaフォルダのSQLファイルから実行されてくれます。
時が立つにつれてmigrationファイルが溜まっていって何が何だかわからない状態だったので助かります。
job batching
Busファサードのbatchメソッドを利用してバッチ処理することができるようになりました。
batchメソッドでは、thenやcatch、finallyが使用できる。
$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();
バッチ処理は、順序管理やエラー管理が大変なのでこれは便利。
improved rate limiting
RateLimiterファサードを使用することで時間あたりのアクセス回数制限を簡単にかけることができます。forメソッドで名前と内容を定義して、Routeのmiddlewareで使用可能です。
RateLimiter::for('uploads', function (Request $request) {
return $request->user()->vipCustomer()
? Limit::none()
: Limit::perMinute(100);
});
uploadsという制限を定義して
Route::middleware(['throttle:uploads'])->group(function () {
Route::post('/audio', function () {
//
});
});
middlewareで使用する。
以前よりわかりやすくなってます。
Improved Maintenance Mode
以前のLaravelのメンテナンスモードでは、IPアドレスでメンテナンスなしへのアクセス許可を出していましたが、このバージョンからsecretオプションを使用することでトークンでのメンテナンスなしへのアクセス許可を出せるようになりました。
トークンを使用したアドレスにアクセスするとクッキーが発行とルートへリダイレクトが行われてメンテナンスモードなしで見れるようです。
また、デプロイ中のcomposer installが終わっていない段階等でアクセスされるとメンテナンスモードでもエラーが発生することがあったため、メンテナンス中のエラーページを事前にレンダリングしておくオプションができました。これによりメンテナンスモード中のエラーをなくすことができます。
php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"
でメンテナンスモードにして
https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515
にアクセスすればメンテナンスモードなしでサイトにアクセスできる。
Closure Dispatch / Chain
新しく追加されたcatchメソッドを使用することで、dispatchに指定された処理のどれかが正常終了しなかった場合に実行される処理を記述することができるようになりました。
dynamic Blade components
ある変数をの値から動的に描画されるコンポーネントを指定できるようになりました。
<x-dynamic-component :component="$componentName" class="mt-4" />
使い道はあるけど、わかりづらくなりそうな気もする。
Event Listener Improvements
イベントへの登録がEvent::listenメソッドを使用することで簡単に行うことができるようになりました。
use App\Events\PodcastProcessed;
use Illuminate\Support\Facades\Event;
Event::listen(function (PodcastProcessed $event) {
//
});
…使いそうで今まで使ってきていないのであまりよくわかっていません。。
time testing helpers
テストで時間を作りたいときなどに役に立つヘルパーが、このバージョンのLaravelからベースクラスに含まれるようになりました。
public function testTimeCanBeManipulated()
{
// Travel into the future...
$this->travel(5)->seconds();
$this->travel(5)->days();
// 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
serveコマンドのリロード機能が強化されて、.envファイルが書き換わった時にもリロードが実施されるようになりました。これ結構面倒くさいと感じていたのでいい感じです。
Tailwind pagination views
ページネーションのCSSはBootstrapではなく、 Tailwind CSSをデフォルトに変更しました。
Tailwind CSSはカスタマイズ性が高いフレームワークで、様々なデザインへ対応できるようです。
Routing Namespace Updates
RouteServiceProviderを使用してルーティングの定義をする際に、以前のLaravelでは$namespaceにデフォルトでApp\Http\Controllersが指定されていたので問題なくUserController等を解決することができた。しかし、Laravel8からはnamespaceはnullになるため解決できなくなります(えっ、、なんでだろう??)。
Laravel7を使用してい流場合は$namespaceをRouteServiceProviderに定義することで問題なくなります。
所感
基本的には今までもう少しなんとかなるといいな、、となっていた部分が解消されているように感じました。まだ実際に動かしていないため、間違っているところもあると思われるので、動かしながら随時更新していきます。
コメント