Laravel 12には 派手さゼロだけど開発者の寿命を伸ばす小粒APIが山ほど紛れ込んでいました。 そこで私はリリースノートを精査し、アプリ側から即呼べる公開 API だけを21本に厳選しました。(2025年6月21日時点で検証は12.19.3まで)
サンプルコードを確認しながらワンライナー例を添えたので、この記事を読み終えたら──
Arr::partition()
で配列を秒で仕分け、Context::scope()
でログの汚れをゼロクリア、- 新しい
assert*
系メソッドでテストコードを1行削り、
Laravel12の新機能を使いこなせるようになっていることでしょう・・・!
「アップグレードしたけど何が増えたのか分からん」というあなたのための、DXブースト実践リファレンスです。
実際に検証できるように、githubにpestのコードサンプルを用意しました。急ぐ方は目次からどうぞ。
🛠️ 検証環境
項目 | 値 |
---|---|
最終検証 | 2025/06/21 |
Laravel | 12.19.3 |
PHP | 8.3.6 |
テスティング | Pest v2 + php artisan test |
DB | SQLite (:memory:) |
実行結果 | 21/21 ✅・47 assertions・0.20 s |
※ 全テストコードは記事末尾のGithubで公開しています。
📜 新 API 一覧(21 本)
Tag | API | ひとことで |
---|---|---|
12.1.0 | Arr::partition() | 真偽で 2 分割 |
12.1.0 | Context::scope() | 一時スコープ実行 |
12.2.0 | Context::increment() / decrement() | 数値を ±N |
12.4.0 | Arr::sole() | 単一ヒット取得 |
12.4.0 | QueueFake::listenersPushed() | キュー済リスナー数 |
12.6.0 | Rules\\Password::appliedRules() | パスワード制約確認 |
12.6.0 | Model::fillAndInsert() | 一括 fill→insert |
12.6.0 | Http::failedRequest() | 直近の失敗取得 |
12.8.0 | Collection::fromJson() | JSON→Collection |
12.10.0 | Fluent + Conditionable | when/unless チェイン |
12.13.0 | TestResponse::assertRedirectBack() | 戻りリダイレクト検証 |
12.14.0 | Context::except() | 指定キー除外 |
12.14.0 | Context::exceptHidden() | 隠しキー除外 |
12.14.0 | Arr::from() | iterable→配列 |
12.15.0 | TestResponse::assertClientError() | 4xx 検証 |
12.15.0 | TestResponse::assertRedirectToAction() | アクション遷移検証 |
12.16.0 | Arr::hasAll() | 全キー存在判定 |
12.16.0 | Rule::contains() | 配列値包含バリデーション |
12.16.0 | Stringable::toUri() | URL エンコード |
12.19.0 | TestResponse::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/
コメントを残す