0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【2026年4月】Laravel/PHP 今月のまとめ|13.3〜13.7のテスト・キュー強化と注目パッケージ総ざらい

0
Posted at

4月の Laravel コアは 13.3 から 13.7 まで5リリース出た。テスト高速化の #[UnitTest] 属性に始まり、FormRequest の厳格モード、デバウンス可能なジョブ、SIGTERM に反応する中断可能ジョブまで、テストとキューの実務改善が並んだ。サプライチェーン側では axios npm への RAT 混入と Composer 2.9.6 の脆弱性修正があり、依存の安全性が現実の脅威として動いた月でもある。

出典はすべて Laravel News の各記事。バージョン番号やメソッド名は原文に合わせている。

TL;DR

  • コアは 13.3〜13.7。#[UnitTest] 属性、FormRequest 厳格モード、キュージョブの状態検査、デバウンス、中断可能ジョブと、テストとキューが軸。
  • テスト基盤も進んだ。Pest 4.5 の不安定テスト自動リトライ、4.6 の時間ベースシャーディング、テスト出力をJSON化する PAO。
  • AI と MCP が広がった。QuickBooks の MCP サーバー化、REST API 構築のエージェントスキル、Spatie のコーディング規約 AI スキル、LangChain 風の PHP フレームワーク LLPhant。
  • サプライチェーン警戒。axios npm への RAT 混入、Composer 2.9.6 の Perforce コマンドインジェクション修正2件。
  • エコシステムは Matt Stauffer の PHP Foundation 理事就任、Laracon US 2026(7/28-29 ボストン)決定。

Laravel コアの進化(13.3 → 13.7)

13.3:#[UnitTest] 属性でテストを部分的にユニット化

Laravel 13.3.0 の目玉は #[UnitTest] 属性だ。TestCase を継承したクラスのうち、コンテナを必要としないメソッドだけフレームワーク起動をスキップでき、素の PHPUnit テストとして桁違いに速く走る。

use Illuminate\Foundation\Testing\Attributes\UnitTest;

class LocationServiceTest extends TestCase
{
    public function test_getCoordinates_resolves_address_for_us(): void
    {
        // needs the container
    }

    #[UnitTest]
    public function test_getState_returns_state_from_abbreviation(): void
    {
        // no framework boot needed
    }
}

このほか、モデル属性が配列でなく可変長引数を受け取れるようになり(#[Fillable('first_name', 'last_name')])、バッチの最初のジョブ処理時に発火する BatchStarted イベントが追加された。詳細モードのキューワーカー出力にはメモリ使用量が出るようになっている。

13.4:FormRequest 厳格モードとジョブの状態検査

13.4.0 は、rules() で宣言していない入力フィールドを拒否する FormRequest の厳格モードを入れた。is_adminrole のような未宣言フィールドがこれまで黙って無視されていた挙動を、明示的に弾けるようになる。

use Illuminate\Foundation\Http\FormRequest;

public function boot(): void
{
    FormRequest::failOnUnknownFields(! app()->isProduction());
}

リクエストクラス単位で #[FailOnUnknownFields] 属性によるオプトインも可能だ。デフォルトは false なので既存挙動は変わらない。

あわせて Queue ファサードにジョブの状態検査メソッドが追加された。

Queue::pendingJobs();    // jobs ready to be processed
Queue::delayedJobs();    // jobs waiting for their delay to expire
Queue::reservedJobs();   // jobs currently being processed by a worker

返るのは uuidnameattemptscreatedAt を持つ InspectedJob のコレクション。Queue::pendingJobs()->countBy('name') のように集計できる。Database と Redis ドライバで動作し、他は空コレクションを返す。

13.5:キュー向け Redis Cluster サポート

13.5.0 は、AWS ElastiCache Serverless(Valkey)などの Redis Cluster で出ていた CROSSSLOT エラーを解消した。キューの Lua スクリプトが複数キーをまたぐ問題に対し、クラスタ接続ではキュー名を Redis のハッシュタグで自動ラップし、関連キーを同じスロットへ寄せる。

queues:{default}           → slot for "default"
queues:{default}:delayed   → slot for "default"
queues:{default}:reserved  → slot for "default"
queues:{default}:notify    → slot for "default"

ConcurrencyLimiter も同じ扱いになり、mget の Lua スクリプトがスロットをまたがなくなった。あわせてキュー済み Mailable での #[Delay] 属性対応、コントローラ Middleware 属性の子コントローラへの継承、CacheManager や MailManager など各 Manager クラスへの enum 対応拡大、updateOrCreate / firstOrNew でのクロージャ値受け付けが入った。

13.6:デバウンス可能なキュージョブ

13.6.0 は、同じジョブが一定時間内に複数回ディスパッチされても最後の1回だけ実行する #[DebounceFor] 属性を追加した。検索インデックス再構築やダッシュボード同期のような「連打されるが最後だけ実行できればよい」処理に向く。

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\Attributes\DebounceFor;

#[DebounceFor(30)]
class RebuildSearchIndex implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable;

    public function __construct(public int $documentId) {}

    public function debounceId(): string
    {
        return (string) $this->documentId;
    }

    public function handle(): void
    {
        SearchIndex::rebuild($this->documentId);
    }
}

ディスパッチ箇所で dispatch(new SyncExternalData($accountId))->debounceFor(30) と適用することもでき、maxWait で遅延の上限も切れる。実行時に最後のディスパッチが勝つ点が、ディスパッチ時に追加を拒否する ShouldBeUnique との違いだ。このほか、ヘルスルート /up の JSON レスポンス対応、構造化ログ向けの JsonFormatter、Cloudflare Email Service 連携も入った。

13.7:SIGTERM に反応する中断可能なジョブ

13.7.0 は、Interruptible インターフェースを実装したジョブがワーカーへのシグナル(SIGTERM など)に反応できるようにした。デプロイで長時間ジョブが途中終了する事故に対し、停止フラグを立ててクリーンアップできる。

use Illuminate\Contracts\Queue\Interruptible;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;

class ReportJob implements ShouldQueue, Interruptible
{
    use Queueable;

    protected bool $stop = false;

    public function handle(): void
    {
        while (! $this->stop) {
            // do work...
        }
    }

    public function interrupted(int $signal): void
    {
        $this->stop = true;
    }
}

個々のジョブが Interruptible を実装していなくてもログやアラートに使える WorkerInterrupted イベント、Vite フォント最適化の @fonts Blade ディレクティブ、複数の JSON 値を一度に検証する assertJsonPaths()、コレクションでの SortDirection enum 対応も加わった。

$response->assertJsonPaths([
    'data.id' => 1,
    'data.name' => 'Taylor',
    'meta.count' => 3,
]);

コア早見表

バージョン 目玉 種別
13.3 #[UnitTest] 属性 / BatchStarted イベント / 可変長引数のモデル属性 機能追加
13.4 FormRequest 厳格モード / pendingJobs() ほかジョブ状態検査 機能追加
13.5 キュー向け Redis Cluster サポート / Manager の enum 対応拡大 機能追加
13.6 #[DebounceFor] デバウンスジョブ / /up の JSON / JsonFormatter 機能追加
13.7 Interruptible 中断可能ジョブ / assertJsonPaths() / @fonts 機能追加

注目パッケージ(テーマ別に厳選)

テスト・CI

  • Pest v4.5.0->flaky() 修飾子と --flaky フラグで、断続的に落ちるテストを設定回数(デフォルト3回)まで自動リトライする。名前空間とファイルパスの大文字小文字不一致を検出する toBeCasedCorrectly アサーションも入った。macOS で通って Linux 本番で落ちる事故の予防に効く。
  • Pest v4.6.0:CI のシャードをファイル数ではなく実行時間で分散させる時間ベースシャーディング。--update-shards でクラスごとのタイミングを記録し、生成される tests/.pest/shards.json をコミットするだけで既存の --shard ジョブを切り替えられる。
  • PAO:Nuno Maduro 製。テストが AI エージェント内で実行されているのを検出し、出力をコンパクトな JSON に置き換える。出力はスイート規模によらず常時およそ20トークンで、Pest では最大99.8%のトークン削減。composer require nunomaduro/pao で導入し設定不要。

キュー・運用

  • Laritor:Laravel 構造に合わせた本番向け可観測性ツール。リクエストごとに全クエリ、外部HTTP呼び出し、フィーチャーフラグ、キャッシュを単一タイムラインで可視化する。Composer 導入と .env の3変数だけで動き、エージェントやサイドカーは不要。Telescope を本番に持っていけない構成で選択肢になる。
  • Laravel IdempotencyPOST / PUT / PATCH のような書き込み系ルートに HTTP 冪等性を付ける。同じ Idempotency-Key と同じペイロードで再送されたら、ハンドラを再実行せずキャッシュ済みレスポンスを再生する。決済や注文作成のリトライによる二重実行を防ぐ。動作にはロック対応キャッシュ(Redis / Memcached)が要る。
use WendellAdriel\Idempotency\Http\Middleware\Idempotent;

Route::post('/orders', StoreOrderController::class)->middleware(Idempotent::class);
  • Laravel Web プッシュ通知laravel-notification-channels/webpush で、ネイティブアプリもサードパーティのプッシュサービスも介さず、VAPID キーだけで Web プッシュ通知チャネルを既存の通知システムに追加できる。via()WebPushChannel を足して toWebPush() を実装する書き方は、メールや Slack の通知と同じだ。

セキュリティ・サプライチェーン

  • axios npm パッケージの侵害:メンテナーのアカウントが乗っ取られ、axios@1.14.1axios@0.30.4 が公開された。axios 本体は無改変で、追加された偽の依存 plain-crypto-js@4.2.1postinstall が RAT を投下する手口。Laravel 側は安全バージョンへのピン留めなどで対応した。
  • Composer 2.9.6:Perforce VCS ドライバーのコマンドインジェクション2件(CVE-2026-40261 / CVE-2026-40176)を修正。悪意ある composer.json や細工されたソース参照から任意コマンドが実行されうる。composer self-update での即時更新が推奨される。2.2.27 LTS でも同じ修正が入った。
  • Spatie のコーディング規約 AI スキルspatie/guidelines-skills で、PHP/Laravel、JavaScript、バージョン管理、セキュリティの4スキルを公開。skills.sh 経由で Claude Code や Cursor、Codex、GitHub Copilot など複数の AI スタックで動く。AI の出力を社の規約に揃える土台になる。

AI・MCP

  • Laravel QuickBooks MCP Server:QuickBooks Online を MCP サーバーとして公開し、AI エージェントに11エンティティ50ツールでフル CRUD を提供する。名前から ID への自動解決、ユーザーごとの接続を分けるマルチテナント対応、OAuth トークンの先行リフレッシュを備える。既存 SaaS を laravel/mcp で AI に開放する実装例として読める。
  • REST API 構築のエージェントスキル:Steve McDougall による Laravel 13+ 向けの Claude Code スキル api-skill。ULID 必須、simplePaginate() 強制、RFC 9457 準拠のエラー、単一アクションの final コントローラーといった意見の強い規約を強制する。git clone で導入できる。
  • LLPhant:LangChain と LLamaIndex に着想を得た PHP の生成 AI フレームワーク。OpenAI、Anthropic、Mistral、LM Studio、Ollama を統一インターフェースで扱え、埋め込みやベクトルストア、QuestionAnswering で RAG パイプラインを PHP だけで組める。ストリーミングやファンクションコーリングにも対応する。

Eloquent・UI

  • Laravel Sluggable:Nuno Maduro 製。トレイトや基底クラスでなく #[Sluggable] 属性ひとつで Eloquent のスラグを自動生成する。衝突処理、スコープ単位の一意性、複数カラム結合、Unicode と CJK の音訳までカバーし、make:sluggable がテーブルスキーマを読んで属性とマイグレーションを生成する。PHP 8.5+ / Laravel 13.5+ が必要。
use NunoMaduro\LaravelSluggable\Attributes\Sluggable;

#[Sluggable(from: 'title')]
class Post extends Model
{
}
  • Activity Log v5:Spatie の監査ログパッケージの v5。LogsActivityCausesActivity を統合した HasActivity トレイトと、ログを一括 INSERT するバッファリングを追加した。最低要件は PHP 8.4 / Laravel 12 で、メソッド名や設定名の改名、batch/pipe システム削除といった破壊的変更を含む。
  • Commentions:Kirschbaum 製。Filament v3/v4 にコメント、メンション、リアクションをドロップインで追加する。InfoList、テーブルアクション、ヘッダーアクションの3通りで組み込め、ポーリングでリアルタイム更新する。
  • Laravel Mobile Pass:Spatie 製。Apple Wallet と Google Wallet のパス(搭乗券、イベントチケット、会員証など)を統一ビルダー API で生成する。端末にインストール済みのパスへライブ更新をプッシュでき、save() が返す MobilePassResponsable なのでコントローラから直接返せる。

今月のトレンド3つ

1. テストとキューの実務改善が一気に来た。 コアは #[UnitTest] 属性によるテスト高速化、FormRequest 厳格モード、ジョブの状態検査、デバウンス、中断可能ジョブと、5リリースすべてがこの2領域に効いた。Pest 4.5 のリトライと 4.6 のシャーディング、PAO のトークン削減も同じ方向で、テストとキューの運用品質を底上げする月だった。

2. AI を PHP / Laravel の中で組む流れ。 QuickBooks の MCP サーバー化、REST API 構築のエージェントスキル、Spatie のコーディング規約 AI スキル、LangChain 風の LLPhant。生成 AI は Python 一択という前提が崩れ、既存の Laravel 資産の上に AI 連携を載せる選択肢が現実的になっている。

3. サプライチェーンの脅威が現実に動いた。 axios npm への RAT 混入と Composer 2.9.6 の Perforce コマンドインジェクション修正が同じ月に出た。コア側でも install:broadcasting が npm/pnpm/yarn に --ignore-scripts を渡すようになり、依存解決とビルド時のコマンド実行リスクへの対策が進んだ。

その他の新着

  • PhpStorm 2026.1:Laravel 13、Livewire、Filament のサポート強化。内蔵 MCP サーバーが inspection や quick-fix を Claude Code などのエージェントに公開し、PHP 8.5 パイプ演算子の quick-fix や Git worktree のファーストクラス対応も入った。
  • Laravel VS Code 拡張 v1.7.0:PestPHP のインテリセンス、新コマンド「Go to route」、Laravel 13 アトリビュート(Authorize / Middleware / Fillable 等)への対応。
  • Cloud CLI:Laravel Zero 製の新 CLI で、ターミナルから Laravel Cloud のデプロイや環境管理ができる。多くのコマンドが --json 対応で CI に組み込みやすい。
  • Laravel Cloud のパスブロッキングwp-admin.env を探るボットの探索リクエストを無視し、休止中アプリの不要な起動を防ぐ。新規アプリではデフォルト有効。
  • Laravel スターターキットのトースト通知:4つの公式キット(React / Vue / Svelte / Livewire)がトースト通知を標準搭載。Inertia 系は Inertia::flash() と Sonner、Livewire 系は Flux::toast() を使う。
  • JSON Alexander:Wes Bos 製のブラウザ向け JSON 閲覧拡張。別の人気フォーマッタが位置情報トラッキングを注入していた懸念を受けた、信頼できる代替として公開された。
  • Laravel Licensing:シート単位の上限や Ed25519 署名の PASETO v4 トークンによるオフライン検証を備えた、商用ソフト配布向けのエンタープライズ品質のライセンス管理。
  • ArtisanFlow:ノードベースのフローチャート UI を Laravel に持ち込むパッケージ。ノードとエッジを素の PHP 配列で定義し <x-flow> Blade コンポーネントに渡すだけで、カスタム JS なしにフローを組める(執筆時点でアルファ版)。
  • Pretty PHP Infophpinfo() を検索可能なモダン UI に置き換え、設定をコードから問い合わせる PHP API も提供する。ini_get() では取れない php.ini のマスター値まで読める。
  • Passage:Laravel アプリをクライアントと外部 API の間に置く軽量プロキシゲートウェイ。Passage ファサードでルートを登録し、Bearer トークンや API キー、HMAC 署名の認証ヘルパーを内蔵する。
  • laravel-pdf 2.6.0:Spatie の laravel-pdf で、生成した PDF をディスク保存せず mailable や通知に直接 attach() できるようになった。
  • laravel-aigeo(GEO):自社の製品やコンテンツを AI の生成回答に露出させる GEO(生成エンジン最適化)ツール。HasGeoProfile トレイトや <x-geo-head> Blade で構造化メタデータを出し、AI クローラ向けファイルを生成する。
  • Paperdoc:PDF や Office 文書を単一 API で生成、解析、変換できるゼロ依存の PHP ライブラリ。OCR や要約などの AI 連携も持ち、Laravel 11+ 向けの一次サポートを同梱する。
  • SaaSykit:決済、サブスク管理、認証、ランディングページまで備えた Laravel ベースの SaaS スターターキット。2周年記念で Complete パッケージが期間限定20%オフ。
  • Polyscope の Windows 版:AI エージェント開発支援アプリ Polyscope が Windows に対応。Laravel Herd 連携や、エージェントへのメッセージごとのチェックポイント自動作成とロールバックを備える。次は Linux 対応予定。
  • MongoDB 操作を冪等にする:フロントエンドで生成した冪等性キーを (user_id, idempotency_key) の複合ユニークインデックスでスコープし、リトライによる決済の二重課金を防ぐ実装解説。
  • MongoDB クエリ性能監視のミドルウェア:Laravel ミドルウェアと MongoDB ドライバのコマンドサブスクライバで、しきい値を超える遅いクエリを performance_logs に記録する。ログ肥大化は TTL インデックスで抑える。
  • Matt Stauffer が PHP Foundation 理事に就任:『Laravel Up and Running』著者で Tighten 代表の Matt Stauffer が就任。最も注力したいのは PHP の評判改善だと語る。
  • Laracon US 2026 開催決定:2026年7月28〜29日にボストン(SoWa Power Station)で開催。初期登壇者は Taylor Otwell、Aaron Francis、Nuno Maduro ら。
  • PHPantom:Rust で書かれた高速な PHP 言語サーバー。1秒未満の起動と低メモリ(約59MB)で、大規模プロジェクトでも軽快に動く。
  • AI チャットエージェントを作る(MongoDB Atlas × Voyage AI):Laravel の AI SDK と Voyage AI の埋め込み、MongoDB Atlas のベクトル検索で RAG 型のチャットエージェントを構築する実装解説。

まとめ

4月は派手な新機能より、テストとキューの足回りを着実に固めたリリースが続いた。#[UnitTest] でテストを部分的にユニット化し、デバウンスと中断可能ジョブでキューの取りこぼしを減らす。Pest のリトライとシャーディングも合わせれば、CI とジョブの安定性に効く改善がそろっている。サプライチェーンの実害が出た月でもあり、依存とビルドの棚卸しは早めに進めておきたい。

このまとめは毎月続ける。詳細は各出典リンクから。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?