前回に引き続き今回はLaravel7系の新機能や変更点について振り返ります。
前回の記事は以下です。
主要な新機能・変更点
バージョンとサポート期間の違い
Laravel6はLTS(Long Term Support)バージョンで、長期的なサポートが行われる安定版です。
一方、Laravel7はLTSではないため、長期サポート期間は提供されません。
その代わりに新機能や改善点が追加され、フレームワークとしてより使いやすくなっています。
プロジェクトによっては安定重視でLaravel6を使うケースもあるでしょうし、新しい機能を積極的に取り入れて生産性を上げるためにLaravel7を採用するケースもあります。
公式HTTPクライアント(Laravel HTTP Client)の追加
Laravel7では、外部APIとの通信を行いやすくするための公式HTTPクライアントが導入されました。
これにより、Guzzleなどのライブラリを直接使わなくても、Laravelらしい記述でHTTPリクエストを簡単に送れるようになっています。
HTTPクライアント例(Laravel7)
use Illuminate\Support\Facades\Http;
$response = Http::get('https://api.example.com/users');
if ($response->successful()) {
$users = $response->json();
// $users変数にAPIからのレスポンスデータが入ります
}
このようにHttp
ファサードを利用することで、わかりやすいコードでAPI通信が可能です。
Laravel6にはこの機能が標準ではないため、API通信には追加でGuzzleパッケージを使う、あるいは独自実装をする必要がありました。
Bladeコンポーネント機能の強化
Laravel6でもBladeコンポーネントは利用できましたが、Laravel7ではコンポーネントの記述方法がより洗練されました。
特にクラスベースのコンポーネントが導入され、コンポーネントに対応するクラスを定義することで、ビュー側をよりシンプルかつ柔軟に書けるようになりました。
Bladeクラスベースコンポーネント例(Laravel7)
コンポーネントクラス(app/View/Components/Alert.php
):
namespace App\View\Components;
use Illuminate\View\Component;
class Alert extends Component
{
public $type;
public function __construct($type = 'info')
{
$this->type = $type;
}
public function render()
{
return view('components.alert');
}
}
コンポーネントテンプレート(resources/views/components/alert.blade.php
):
<div class="alert alert-{{ $type }}">
{{ $slot }}
</div>
利用側テンプレート(resources/views/welcome.blade.php
など):
<x-alert type="warning">
これは警告メッセージです。
</x-alert>
これにより、コンポーネントのロジックとテンプレートが明確に分離され、保守性が向上します。
Laravel6でもBladeコンポーネントは存在しますが、Laravel7ではより直感的で再利用しやすいコンポーネント実装が可能となりました。
カスタムEloquentキャストの改善
Laravel7では、Eloquentモデルでデータを読み書きする際に利用する「カスタムキャスト」が強化されています。
これにより、モデルの属性を独自の型やオブジェクトとして扱うことが容易になりました。
たとえば、JSONカラムを自動的にオブジェクトとして取り扱う、独自の日付フォーマットや値変換を行うなどが簡潔に書けます。
カスタムキャスト例(Laravel7)
namespace App\Casts;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
class UpperCase implements CastsAttributes
{
public function get($model, $key, $value, $attributes)
{
return strtoupper($value);
}
public function set($model, $key, $value, $attributes)
{
return strtolower($value);
}
}
// モデルでの利用例
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Casts\UpperCase;
class Post extends Model
{
protected $casts = [
'title' => UpperCase::class,
];
}
上記の例ではtitle
属性を常に大文字で取得し、小文字で保存するカスタムキャストを定義しています。
Laravel6でもキャストは使えましたが、Laravel7でカスタムキャスト機能がより洗練され、開発者が独自ロジックを簡単に差し込めるようになりました。
文字列操作がより直感的に(Fluent String Handling)
Laravel7では、Str
クラスやstringable()
ヘルパーにより、文字列操作がより流暢(Fluent)なスタイルで書けます。
これにより、チェーンメソッドで文字列を次々と操作でき、読みやすくメンテナンスしやすいコードが書けるようになりました。
Stringable例(Laravel7)
use Illuminate\Support\Str;
$processed = Str::of('Hello World')
->lower()
->replace('hello', 'hi')
->title();
echo $processed; // "Hi World"
このような記述はLaravel6以前でもStr
ヘルパーは使えましたが、of()
メソッドによる流れるような書き方(メソッドチェーン)がサポートされたのはLaravel7からです。
上記以外での主な新機能・変更点
ルーティングキャッシュの改良
- 中間ウェアのグループ化をサポートし、ルートキャッシュのパフォーマンスが向上。
CORS サポート
- パッケージ不要でネイティブな CORS(クロスオリジンリソースシェアリング)をサポート。
cors.php
設定ファイルで簡単に設定可能。
Queue メイルキューの改良
- キューに対するバッチのサポートやトランザクション管理が強化。
Route Model Binding Improvements
- モデルバインディングがより強化され、複数のキーでの検索が可能に。
Markdown メールテンプレートの改良
- Markdown メールのテンプレートがカスタマイズ可能に。
スケジュールタスクの改善
then
,onFailure
メソッドを使って、タスクの成功時や失敗時の処理を記述可能。
Laravel Airlock(後の Sanctum)
- シングルページアプリケーション(SPA)やモバイルアプリ向けの軽量認証システム。
- API トークン認証の簡易化。
Symfony 5 コンポーネントのサポート
- Symfony 5 のコンポーネントを利用可能に。
Artisan コマンドの改良
- Artisan コマンドにおける改善や新機能の追加。
artisan test
コマンドで PHPUnit テストを簡単に実行可能。
MySQL 8 JSON パスのサポート
- MySQL 8 の JSON パス操作に対応。
パフォーマンス改善とバグ修正
- コアフレームワークの最適化と安定性向上。
Laravel6からLaravel7への主な変更点
- Laravel6はLTSで長期サポート、Laravel7はLTSではないが新機能や改善が充実。
- Laravel7では公式HTTPクライアントが追加され、外部APIとの通信が容易。
- Bladeコンポーネントがクラスベースでより柔軟に使えるように。
- カスタムEloquentキャスト機能が強化され、モデル属性の扱いが洗練。
- FluentなString操作が可能になり、文字列処理が直感的に。
- ルートモデルバインディングの柔軟性向上やSanctumなどの公式パッケージ整備で、開発効率が向上。
まとめ
Laravel7で公式のHTTPクライアントが追加されたことは大きな変化だったなと思います。
また、Bladeコンポーネントがクラスベースになったことも現バージョンに生きてきているのかなと感じました。