- カテゴリ: helper
- 掲載バージョン: Laravel 12・PHP 8.4
- 名前空間 / FQCN / コマンド:
abort_if(グローバル関数) - 関連: abort / abort_unless / throw_if / throw_unless / abort_if
- 変更履歴: Laravel 5.2.22 で
abort_if/abort_unlessが追加(当時の紹介記事) (laraveldaily.com)
要点(TL;DR)
- 何に使うか:条件に一致したら即座にHTTPエラー(例外)を投げて処理を止める
- 最低限の使い方:
abort_if($user->isBanned(), 403);(Laravel) - よくある罠:
- **「レスポンスを返す」ではなく「例外を投げる」**ので、後続処理は実行されない (Stack Overflow)
- ビジネスロジック層で多用すると、HTTP層に強く依存しがち(責務の混在)
throw_ifと混同しやすい(投げる例外の種類が違う)
概要
abort_if は、条件が true のときに abort() を呼び出し、HTTP例外を投げてリクエスト処理を中断します。コントローラやミドルウェアで「条件に合わないアクセスを即座に拒否する」用途で、if (...) abort(...) を1行にできます。 (Laravel)
構文 / シグネチャ
abort_if(bool $boolean, int $code, string $message = '', array $headers = []): void
実装は「trueなら abort($code, $message, $headers)」という形です(互換実装例)。 (GitHub)
- 引数
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
$boolean | bool | ✅ | – | true のとき中断(例外を投げる) |
$code | int | ✅ | – | HTTPステータスコード(例: 403, 404) |
$message | string | ❌ | '' | レスポンス本文のテキスト(状況により表示される) |
$headers | array | ❌ | [] | 追加レスポンスヘッダ |
- 戻り値:
void(実質的に例外で処理が止まる) - 例外/副作用:HTTP例外(
abort()が投げる例外)が発生し、例外ハンドラによりエラーページ/JSON等がレンダーされます (Laravel)
使用例
最小例
<?php
use Illuminate\Support\Facades\Auth;
abort_if(! Auth::check(), 401, 'Unauthenticated.');
// ここには到達しない(例外)
実務例
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController
{
public function show(Request $request, Post $post)
{
// 下書きを他人が見ようとしたら 404 で隠す(存在自体を漏らさない)
abort_if($post->is_draft && $request->user()?->id !== $post->user_id, 404);
return view('posts.show', ['post' => $post]);
}
}
よくある落とし穴・注意
- APIでのエラー形式に注意:
abort_ifは例外なので、JSON API では例外ハンドリング(render/exceptions設定)次第で出力形式が変わります。APIの統一エラー形式が必要なら、例外クラス+ハンドラで揃える方が管理しやすいです。 (Laravel) - ドメイン層で多用しない:HTTPステータスに依存するため、ユースケース/サービス層では
throw_if(ドメイン例外)→コントローラ側でHTTPに変換、の方が分離しやすいです(選定はチーム規約で)。 abort_unlessとの読み替え:否定条件が続くならabort_unless($ok, 403)の方が読みやすいことが多いです。 (Laravel)
代替・関連APIとの比較
- abort:無条件で中断したいとき。
abort_ifは「条件付きabort」。 (Laravel) - abort_unless:条件が
falseのとき中断。ガード節で読みやすい場合が多い。 (Laravel) - throw_if / throw_unless:HTTPではなく任意の例外を投げたい(ドメイン例外・アプリ例外)ときに選ぶ(責務分離向き)。 (Laravel)
テスト例(Pest)
use Symfony\Component\HttpKernel\Exception\HttpException;
it('aborts when condition is true', function () {
abort_if(true, 403);
// ここには来ない
})->throws(HttpException::class);
トラブルシュート(エラー別)
| 症状/エラー | 原因 | 対処 |
|---|---|---|
| 例外で落ちて処理が止まる | abort_if は例外を投げる仕様 (Stack Overflow) | 期待通り。後続処理を書かない/ガード節として使う |
| APIのエラーJSONが期待と違う | 例外ハンドリング設定(Laravel 11+は bootstrap/app.php 側など) | 例外ハンドラ側で HttpException のレンダーを統一する (Laravel) |
| ビジネスロジックがHTTP依存になって辛い | ドメイン層で abort_if を使っている | ドメイン例外 + throw_if に寄せ、HTTP変換は境界(Controller/Middleware)で |
参考リンク
- Laravel公式ドキュメント: Helpers(abort_if / abort_unless の説明) (Laravel)
- Laravel公式ドキュメント: Error Handling(abort が投げる例外とレンダー) (Laravel)
abort_if/abort_unless追加の経緯(Laravel 5.2.22 当時の紹介) (laraveldaily.com)

