Development

Laravel FormRequestのauthorizeメソッドは本当に必要?

FormRequestの`authorize()`メソッドは、リクエストされた処理を実行するための認可を判断するためのメソッドです。通常、このメソッドがtrueを返すことでリクエストが許可され、falseの場合は拒否されます。

背景

私がLaravelを学習した際は、FormRequestを使用する場合、アプリケーションの別の部分で認可の処理をするなら`authorize()`メソッドでtrueを返すように実装すると学びました。

public function authorize()
{
    return true;
}

そのためFormRequestを作るたびに、このコードを当然のように記述していました。しかし、ある日上司からこんなレビューを受けました。

authorizeのメソッドは削除していただいて大丈夫です!
継承元のFormRequestを参照してみてください。authorizeが実装されていないのであればtrueを返すみたいな実装になっています

意外な指摘に驚きつつ、本当に削除してよいのか確認してみることにしました。

vendor配下を確認

実際に、以下のファイルを確認しました。

vendor/laravel/framework/src/Illuminate/Foundation/Http/FormRequest.php

すると、次のような実装を発見しました。

protected function passesAuthorization()
{
    if (method_exists$this, 'authorize')) {
        $result = $this->container->call([$this, 'authorize']);

        return $result instanceof Response ? $result->authorize() : $result;
    }

    return true;
}

そうなんです。FormRequestの基底クラスには、authorizeメソッドが存在しなければデフォルトで`true`を返す処理がすでに実装されていたのです。

公式ドキュメントではどう書かれているのか

Laravel 12.xの公式ドキュメントにも、このことが明確に記載されています。

If you plan to handle authorization logic for the request in another part of your application, you may remove the authorize method completely, or simply return true:

訳すと、「アプリケーションの別の部分で認可の処理を行う場合、authorizeメソッドは完全に削除するか、単にtrueを返すだけにできます」とのことです。

【参照URL】https://laravel.com/docs/12.x/validation#form-request-validation

変更のきっかけとなったPR

実は、過去にはauthorizeメソッドが未定義の場合はfalseを返す仕様だったため、必ず定義する必要がありました。ところが、Laravel 5.8からは以下のPRがマージされ、デフォルトで`true`を返す仕様に変更されたのです。

【PR #25417】https://github.com/laravel/framework/pull/25417

同じ内容を解説しているZenn記事

Zennにも同様の内容を分かりやすくまとめた記事がありました。

Laravel FormRequestクラスのauthorizeメソッドで何もしないなら実はtrueを返す必要がなくなっていたお話
https://zenn.dev/naopusyu/articles/fa4fdaf7d12dab

まとめ

  • Laravel 5.8以降、`authorize()`を定義しなくてもデフォルトでtrueを返す
  • 公式ドキュメントでもこの仕様は明記されている
  • 最新の仕様や情報はソースコードや公式ドキュメント、コミットログで確認しよう

今回の件をきっかけに、普段何気なく書いているコードについても、改めてその理由や背景を確認することが大切だと感じました。

おすすめ記事

Recommend