前回に引き続き今回はLaravel8系の新機能や変更点について振り返ります。
前回の記事は以下です。
本記事ではは主に以下の観点で整理します。
- 認証機能の初期セットアップ方法の違い
- モデルファクトリー構文の変更
- 新しいデフォルトアプリケーションディレクトリ構成
- ルーティングでの名前空間設定の変更
- Laravel Jetstreamの登場と認証まわりの変化
主要な新機能・変更点
認証機能周りの変化:Laravel UIからLaravel Jetstreamへ
Laravel 7までは、laravel/ui
パッケージを利用してphp artisan ui react --authやphp artisan ui vue --auth
などで認証機能のひな型を一発生成できました。
一方、Laravel 8ではlaravel/jetstream
が導入され、これが新しい標準認証スキャフォールドとして推奨されています。
JetstreamはTailwind CSSやLivewire、Inertia.jsなどのモダンなツールと統合し、よりモダンなフロントエンドスタックを提供します。
ただし、Laravel UIも利用可能ではあるため、プロジェクトの要件次第で使い分けることも可能です。
簡単な認証設定の例
以下はLaravel 7での認証スキャフォールドの例です。
# Laravel 7プロジェクト内で
composer require laravel/ui
php artisan ui vue --auth
npm install && npm run dev
php artisan migrate
上記でVue.jsベースの認証画面が自動生成されます。
Laravel 8では、Jetstreamを使うと以下のようになります。
# Laravel 8プロジェクト内で
composer require laravel/jetstream
php artisan jetstream:install livewire
npm install && npm run dev
php artisan migrate
このコマンドで、Livewireベースの認証画面やユーザープロファイル管理がセットアップされます。
もしVueやReactにこだわりがなければ、この方法でよりモダンなUIスタックを簡単に構築できます。
モデルファクトリーの変化
Laravel 7までのモデルファクトリーはdatabase/factories
ディレクトリ下にあるUserFactory.php
のような1ファイルにまとまった形で定義されていました。
Laravel 8ではモデルファクトリーの書き方がよりクラスベースで分かりやすい形に変更され、database/factories
ディレクトリ配下にモデルごとのFactoryクラスが作成されます。
Laravel 7でのモデルファクトリー例
// database/factories/UserFactory.php
$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'password' => bcrypt('password'), // ハッシュ化パスワード
'remember_token' => Str::random(10),
];
});
Laravel 8でのモデルファクトリー例
// database/factories/UserFactory.php
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
class UserFactory extends Factory
{
protected $model = User::class;
public function definition()
{
return [
'name' => $this->faker->name,
'email' => $this->faker->unique()->safeEmail,
'password' => bcrypt('password'), // ハッシュ化パスワード
'remember_token' => Str::random(10),
];
}
}
このように、Factory
クラスを継承し、$model
プロパティやdefinition()
メソッドを使ってモデルごとの定義をクラス単位で明確に記述できます。
これにより、可読性が上がり、モデルごとのファクトリー管理が容易になります。
デフォルトアプリケーションディレクトリ構成の変更
Laravel 8ではapp/Models
ディレクトリがデフォルトで復活しました。
Laravel 7以前のバージョンでは、モデルはapp
直下に配置されるのが一般的でしたが、8ではapp/Models
が標準的な場所になります。
ただし、強制ではなく、自分好みにカスタマイズできます。
簡単なモデル例
// Laravel 7以前: app/User.php にモデルが存在
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
// ...
}
// Laravel 8: app/Models/User.php にモデルが存在
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
// ...
}
このようにプロジェクト構成が整理され、モデルをより明確な場所に配置できます。
ルーティング周りの変更点
Laravel 7までは、コントローラールート定義時にApp\Http\Controllers
名前空間が自動的に付与されていました。
Laravel 8では、この自動付与が行われなくなり、ルート定義時にコントローラーをフルパスで指定することが求められるようになりました。
この変化によって、名前空間まわりの混乱が軽減され、明示的なコントローラー指定が可能になります。
Laravel 7でのルート例
// Laravel 7: routes/web.php
Route::get('/users', 'UserController@index');
Laravel 8でのルート例
// Laravel 8: routes/web.php
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index']);
このような指定を行うことで、どのコントローラーを呼び出すかが明確になります。
Laravel Jetstreamの登場
Laravel JetstreamはLaravel 8から導入された新しい認証系スタックで、前述のとおりLaravel UIの後継的存在です。
Jetstreamを使うことで、ユーザー登録、ログイン、メール認証、パスワード再設定、2段階認証(2FA)などがすぐに実装できます。
加えて、LivewireかInertia.jsを選択してモダンなフロントエンドとの統合を行えるため、開発速度が大きく向上します。
Jetstreamを利用した簡単なコントローラー例
Jetstream導入後にはユーザーはApp\Models\User
として扱われます。
以下はユーザーを一覧表示するシンプルなコントローラー例です。
// app/Http/Controllers/UserListController.php
namespace App\Http\Controllers;
use App\Models\User;
class UserListController extends Controller
{
public function index()
{
$users = User::all();
return view('users.index', compact('users'));
}
}
views/users/index.blade.php
で$users
をループし、表示すれば、Jetstreamによる認証管理下でのユーザー情報を容易に確認できます。
{{-- resources/views/users/index.blade.php --}}
<!DOCTYPE html>
<html>
<head>
<title>ユーザー一覧</title>
</head>
<body>
<h1>ユーザー一覧</h1>
<ul>
@foreach ($users as $user)
<li>{{ $user->name }} ({{ $user->email }})</li>
@endforeach
</ul>
</body>
</html>
上記以外での主な新機能・変更点
動的キュー構成
- キューの接続設定を動的に変更可能。
Job Batching
- 複数のジョブを一括で処理する「バッチ」機能を追加。
- バッチ全体の成功や失敗に応じたコールバックが可能。
時間制約付きメンテナンスモード
- Artisan のメンテナンスモードに時間制約オプションを追加。
- 一定時間後にメンテナンスモードが自動的に終了。
Blade Components: Inline View
- Blade コンポーネントでインラインテンプレートをサポート。
ルートの改良
route:list
コマンドの表示がより見やすく改良。- コントローラーメソッドのパイプライン呼び出しをサポート。
Rate Limiting Improvements
- レートリミッティングが柔軟に設定可能。
RateLimiter
を使用して複雑な制限ロジックを定義。
時間遅延付きキュー
- ジョブの遅延実行を時間ベースで指定可能。
Job プロパティの更新
- ジョブのプロパティが一貫して処理可能になる。
Eloquent Relationship Methods
- 関連付けを簡単に処理できる新しいメソッドが追加。
イベントリスナーの優先度
- イベントリスナーに優先度を指定可能。
マルチカラムのユニーク検証
- フォームリクエストバリデーションで複数列のユニーク制約をサポート。
Rate Limiting Middleware
- ミドルウェアでレートリミットを柔軟に設定可能。
テストの改良
assertDatabaseCount
やassertNotSoftDeleted
などの新しいアサーションメソッドを追加。
Queue Worker の改良
- Queue Worker のパフォーマンス向上と信頼性の向上。
Docker サポートの向上
- Sail を利用した公式の Docker 開発環境を導入。
アップストリーム変更
- Symfony 5.1 のサポート。
- Flysystem 2.0 のサポート。
バグ修正とパフォーマンス改善
- フレームワーク全体の安定性と最適化。
Laravel 7とLaravel 8の違い
認証スキャフォールドの標準化、モデルファクトリー記述方式の変更、デフォルトディレクトリ構成の調整、ルーティングの名前空間取扱いの変更など、開発者がより明示的でわかりやすいコードを書くためのアップデートが盛り込まれています。
特にLaravel Jetstreamの登場は、フロントエンドツールとの統合を強化し、モダンなアプリケーションを短期間で構築するうえで役立ちます。
まとめ
Laravel8では標準認証機能がLaravel UIからLaravel Jetstreamへ変更されました。
また、ルーティングでのコントローラーの指定方法が変更されました。
個人的にうれしかったのはModelsディレクトリの復活でした。