83841


Laravel8を利用しています。

Laravelには様々なExceptionが定義されておりますが、  
こちらの使い分けを知りたいと思っております。

しかし、検索の仕方が悪いのかなかなか出てきません。

例えば、ログイン時にエラーが発生した場合のExceptionは、  
`UnauthorizedException`なのでしょうか？`AuthenticationException`なのでしょうか？

UnauthorizedExceptionの中身を見ても、

[code]

    class UnauthorizedException extends RuntimeException
    {
        //
    }
    
[/code]

としか書いておらず、どのようなタイミングで利用するかがわかりません。

こちらご存じの方がいらっしゃいましたらご教示いただけますと幸いです。  
また、もしあればなのですが、エクセプションの利用するシーンをまとめてあるヘルプページなどもご存知でしたらご教示いただけますと幸いです。

よろしくお願いいたします。


CC BY-SA 4.0
2021-09-06T03:07:34.417
82273
2021-11-28T07:51:28.027
31257
question
php laravel exception
LaravelのExceptionの種類とどれを使うか


# 前提知識

まず， **認証(Authentication)** と **認可(Authorization)** は明確に異なるものです。

  * [認証 8.x Laravel](https://readouble.com/laravel/8.x/ja/authentication.html)
  * [【Laravel】 認証や認可に関する補足資料 - Qiita](https://qiita.com/mpyw/items/8c5413b99b8e299f7002)

上記記事より引用

> ## ステータスコードや例外クラス名の違い
>
> 名称 | HTTP  
> Status | Application Exception | HTTP Exception  
> ---|---|---|---  
> 認証  
> Authentication | 401  
> Unauthorized | `AuthenticationException` | `UnauthorizedHttpException`  
> 認可  
> Authorization | 403  
> Forbidden | `AuthorizationException` | `AccessDeniedHttpException`  
  
(HTTP 401 Unauthorized は名前が矛盾していますがおそらく歴史的な理由です)

# 回答

### 認証エラーは， `AuthenticationException` 1択

  * `Guard::authenticate()` で自動的にスローされるものはこれ
  * エラーハンドラによって， HTTP レスポンスとして返すときには `UnauthorizedHttpException` に変換される

自分で投げるときは，`AuthenticationException` を選びます。コントローラなど HTTP の知識がある場所では
`UnauthorizedHttpException` を直接投げても OK です。

### 認可エラーは，事実上 `AuthorizationException` 1択だが，コンポーネント同士の疎結合を守るために仮置きされた
`UnauthorizedException` も形式的に存在する

  * `Gate::authorize()` で自動的にスローされるものは `AuthorizationException`
  * `FormRequest::authorize()` で自動的にスローされるものも `AuthorizationException`
    * 但し，`FormRequest` に「（コントローラ）引数による DI でインスタンスが解決されたときに自動的にバリデーションを実行する」という挙動を与えるための **`ValidatesWhenResolved` コントラクト/トレイト が `illuminate/validation` コンポーネントにあり，これが [直接 `illuminate/auth` への依存を持つことを回避したい](https://github.com/illuminate/validation/blob/master/composer.json)** ので，いったん `illuminate/validation` 配下に独自で置いた `UnauthorizedException` を仮で充てている。実際に `illuminate/foundation` コンポーネント（全部入りの雑多な詰め合わせ）に存在する `FormRequest` に定義するときは， `AuthorizationException` を使うように置き換えている

というのが実情です。

自分で投げるときは，基本的には `AuthorizationException` で良いと思います。またこれも同様に，コントローラなど HTTP
の知識がある場所では `AccessDeniedHttpException` を直接投げても OK です。


CC BY-SA 4.0
2021-11-28T07:38:13.263
83841
2021-11-28T07:51:28.027
2021-11-28T07:51:28.027
940
940
82273
answer