abort_if — 条件がtrueならHTTP例外で中断

helper
  • カテゴリ: 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)

  • 引数
引数必須既定値説明
$booleanbooltrue のとき中断(例外を投げる)
$codeintHTTPステータスコード(例: 403, 404)
$messagestring''レスポンス本文のテキスト(状況により表示される)
$headersarray[]追加レスポンスヘッダ
  • 戻り値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)
レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする