メシのタネ

メシのタネになる、Laravelや設計思想の技術配信サイト


Laravel12公開API実践リファレンス!21の新機能でDXを加速させろ!


  1. Laravel
  2. Laravel12公開API実践リファレンス!21の新機能でDXを加速させろ!

Laravel 12には 派手さゼロだけど開発者の寿命を伸ばす小粒APIが山ほど紛れ込んでいました。 そこで私はリリースノートを精査し、アプリ側から即呼べる公開 API だけを21本に厳選しました。(2025年6月21日時点で検証は12.19.3まで)

サンプルコードを確認しながらワンライナー例を添えたので、この記事を読み終えたら──

  • Arr::partition() で配列を秒で仕分け、
  • Context::scope() でログの汚れをゼロクリア、
  • 新しい assert* 系メソッドでテストコードを1行削り、

Laravel12の新機能を使いこなせるようになっていることでしょう・・・!

「アップグレードしたけど何が増えたのか分からん」というあなたのための、DXブースト実践リファレンスです。

実際に検証できるように、githubにpestのコードサンプルを用意しました。急ぐ方は目次からどうぞ。

🛠️ 検証環境

項目
最終検証2025/06/21
Laravel12.19.3
PHP8.3.6
テスティングPest v2 + php artisan test
DBSQLite (:memory:)
実行結果21/21 ✅・47 assertions・0.20 s

※ 全テストコードは記事末尾のGithubで公開しています。

📜 新 API 一覧(21 本)

TagAPIひとことで
12.1.0Arr::partition()真偽で 2 分割
12.1.0Context::scope()一時スコープ実行
12.2.0Context::increment() / decrement()数値を ±N
12.4.0Arr::sole()単一ヒット取得
12.4.0QueueFake::listenersPushed()キュー済リスナー数
12.6.0Rules\\Password::appliedRules()パスワード制約確認
12.6.0Model::fillAndInsert()一括 fill→insert
12.6.0Http::failedRequest()直近の失敗取得
12.8.0Collection::fromJson()JSON→Collection
12.10.0Fluent + Conditionablewhen/unless チェイン
12.13.0TestResponse::assertRedirectBack()戻りリダイレクト検証
12.14.0Context::except()指定キー除外
12.14.0Context::exceptHidden()隠しキー除外
12.14.0Arr::from()iterable→配列
12.15.0TestResponse::assertClientError()4xx 検証
12.15.0TestResponse::assertRedirectToAction()アクション遷移検証
12.16.0Arr::hasAll()全キー存在判定
12.16.0Rule::contains()配列値包含バリデーション
12.16.0Stringable::toUri()URL エンコード
12.19.0TestResponse::assertRedirectBackWithErrors()エラー付き戻り検証
たねまる

API が多すぎ〜!この後カテゴリーごとにスニペット貼っていくよ〜。

💻 カテゴリ別コードリファレンス

ここからは、ワンライナーコードとともに利用方法を記載していきます!

🧩 配列 & 文字列系

// Arr::partition — 偶数と奇数に分けるだけで地味に便利
[$even,$odd] = Arr::partition([1,2,3,4], fn($v)=>$v%2===0);

// Arr::sole — 「唯一を取りたい」時の安全版 find()
$user = Arr::sole($users, fn($u)=>$u['id']===42);

// Arr::hasAll — Config チェックの if 連発とおさらば
if (Arr::hasAll($payload, ['name','email'])) {
    // all good
}

// Arr::from — コレクションを即座に生配列へ
Arr::from(collect(['a','b'])); // ['a','b']

// Stringable::toUri — UI で使うとき地味に書きやすい
$url = Str::of('Hello World!')->toUri(); // Hello%20World!

配列を二分し、唯一要素を安全に抜き、キー存在を一発判定、コレクションを瞬時に生配列化、文字列を即 URL 化──これだけで前処理ボイラープレートが丸ごと蒸発。脳のリソースを本質ロジックに集中できます!

🗂️ Context (ログ) ユーティリティ

// Context::scope — スコープを抜けたら自動 rollback
Context::add('global','on');
Context::scope(function () {
    Context::add('scoped','tmp'); // ← このキーは外に漏れない!
});

// increment / decrement — ログメトリクスのカウンタに最適
Context::increment('views');
Context::decrement('stock',5);

// except / exceptHidden — 隠しコンテキストをフィルタ
Context::addHidden('token','***');
$safe = Context::exceptHidden();

ログまわりの一時値・カウンタ・秘匿情報を丸ごと Context で制御。scope() で漏れゼロ、increment() で GA 風カウント、exceptHidden() で機密だけ即マスク。ミドルウェアもイベントも汚さず、ログ設計が一段カッチリキマります👓️

📦 Model / Collection 便利系

// fillAndInsert — Factory いらずでサクッと複数行
Post::fillAndInsert([
    ['title'=>'A','user_id'=>1],
    ['title'=>'B','user_id'=>1],
]);

// fromJson — もう json_decode→collect は不要
$cfg = Collection::fromJson('{"mode":"prod"}');

シードもファクトリも不要、fillAndInsert() が配列をそのまま Eloquent に流し込み一括 INSERT。試作DBを秒で組み立てられるうえ、fromJson() が生 JSON を一発 Collection へ昇華。

✅ バリデーション

// Password::appliedRules — 生成したルールの中身を IDE で確認可
$pwd = Password::min(10)->letters()->numbers();
Log::debug($pwd->appliedRules());

// Rule::contains — タグ系入力の「○○を必ず含む」に
Validator::make([
    'tags'=>['php','laravel']
], [
    'tags'=>Rule::contains(['laravel','php'])
])->passes();

バリデーションルールは書いて終わりから可視化&再利用へ。Password::appliedRules()で IDE に条件が丸見え、謎ルールとおさらばできます。

🧪 テストアサーション系

// 戻りリダイレクト
$this->from('/form')->post('/submit')->assertRedirectBack();

// 戻り + エラー
$response->assertRedirectBackWithErrors(['name']);

// 4xx 系
$response->assertClientError();

// アクションへリダイレクト
$response->assertRedirectToAction('UserController@index');

// QueueFake — リスナー数を取れるのは地味に神
Queue::fake();
Queue::push(new CallQueuedListener('Foo@handle',[]));
expect(Queue::listenersPushed())->toHaveCount(1);

テストの面倒な期待値をメソッド化して手首への負荷ゼロへ。assertRedirectBack* でフラッシュ&戻り挙動を一網打尽、assertClientError() で 4xx を 1 行判定、assertRedirectToAction() でコントローラ遷移まで保証できます!

🌐 HTTP クライアント “改良” 3 点セット

// pool — Promise 解決順が安定 (pool自体は9から存在12で改良)
[$a,$b] = Http::pool(fn($p) => [
    $p->get('api/1'),
    $p->get('api/2'),
]);

// preventStrayRequests — テスト誤爆を秒で検知 (これも10から存在12で改良) 
Http::preventStrayRequests();
Http::fake(['api/*'=>Http::response('ok')]);

// failedRequest — 最後に throw された RequestException
try {
    Http::get('api/error')->throw();
} catch (RequestException $e) {}
Log::warning(Http::failedRequest());

Laravel 12 で HTTP テスト体験が一段進化。pool() の非同期結果が投入順に安定し、複数 API の合成テストがブレ知らず。preventStrayRequests() は野良リクエストから CI を守り、failedRequest() が最後の例外を即ログ出力。
実運用でハマりがちな「並列」「外部誤爆」「失敗解析」をまとめて処理することができます!

📂 全テストコード (GitHub)

https://github.com/wasipo/syugyou/blob/main/tests/Unit/laravel12-test.php

🐥 まとめ

Laravel12は日常開発の痒い所を 21 本の新 API と多数の細かな改良で解消。

  • 配列 & 文字列 – 下処理をワンライナー化。
  • Context & Collection – ログ文脈と JSON 取り回しがラクに。
  • バリデーション & テスト – よく書くロジックがメソッド化。

FAQ

「公開 API」って具体的に何を指していますか?

フレームワーク外部から public に呼び出せるメソッド/ヘルパのみ。内部専用ロジックや型修正だけの変更は除外しています。(内部変更はまた今度やる予定)

最低でもどのサブバージョンに上げれば良い?

21 本すべて使うなら 12.19.0 以上 を推奨(最後の assertRedirectBackWithErrors() が 12.19.0 で追加)。

Http::pool()preventStrayRequests() は新機能じゃないの?

どちらも 8/9 系から存在。12 ではバグ修正・例外名統一などの改良が入ってます。

コード例が長い…まとめてダウンロードできますか?

https://github.com/wasipo/syugyou/blob/main/tests/Unit/laravel12-test.php

Laravelの環境構築がしたいです。

以前こちらにて解説しました!よろしければ見てください。👉️ https://mikaduki.info/laravel/laravel12-livewire-guide/


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.