SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

人気のPHPフレームワークLaravelを習得しよう

Laravelのエラーハンドラを理解しよう

人気のPHPフレームワークLaravelを習得しよう 第7回

  • X ポスト
  • このエントリーをはてなブックマークに追加

例外クラスを利用したエラーハンドラ

 前節でエラーハンドラのカスタマイズとして、Handlerクラスのreport()メソッドとrender()メソッドの記述方法を紹介しました。本節では、同じくエラーハンドラのカスタマイズ方法として、もうひとつ別の方法を紹介しましょう。

例外クラス内に記述できるreport()とrender()

 Handlerクラスに記述したreport()メソッドとrender()メソッドの両メソッドは、実は、例外クラスにも記述することができます。例えば、ファイルにアクセスする処理中に、該当ファイルが見つからないなどの致命的な問題がある場合に発生する独自例外としてFileAccessExceptionがあるとします。この例外が発生した場合は、report()メソッドの処理としてメールの送信を、render()メソッドの処理として独自の例外画面を表示させるとします。

 前節で紹介したように、report()、および、render()メソッド内に次のような分岐を記述しても問題なく動作します。

if($exception instanceof FileAccessException) {
	:
}        

 一方で、FileAccessExceptionクラスそのものに、次のようにreport()、および、render()メソッドを記述してしまうこともできます。

<<?php
namespace App\Exceptions;

use Exception;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

class FileAccessException extends Exception
{
	public function report(): void
	{
		// メール送信処理
	}
	
	public function render(Request $request): Response
	{
		$data["errorMsg"] = $this->getMessage();
		return response()->view("errors.custom", $data);
	}
}

        

 report()メソッドとrender()メソッド内の記述方法は、前節で紹介したHandlerクラスでの記述方法と同じです。ただし、そもそも例外クラス内での記述ですので、発生した例外クラスに応じての分岐が不要となり、そのため、両メソッドの引数から発生した例外を表す$exceptionがなくなっています。

例外クラスに記述するかHandlerクラスに記述するか

 このように、独自例外クラス内にreport()メソッドとrender()メソッドを記述することで、Handlerクラスに記述するよりも、その例外が発生した場合にどのような記録処理と表示処理が行われるのか一目瞭然となり、ソースコードの見通しがよくなります。

 そういった意味で、Handlerクラスをカスタマイズするのではなく、各例外クラスにreport()メソッドとrender()メソッドを記述する方式のほうがいいのかというと、そうとも言い切れないところがあります。

 というのは、例外クラスにreport()メソッドを記述すると、デフォルトの記録処理、つまり、Handlerクラスではparent::report()と記述していた処理は行われません。そういった意味で、先に紹介したデフォルトの記録処理と独自の記録処理を組み合わせた処理というのは行えません。

 また、render()メソッドにしても、例えば、どの独自例外が発生しても、表示させる画面も同じならば、同じ処理コードが各々の例外クラスに散在することになります。その場合は、Handlerクラスをカスタマイズしたほうがスッキリします。

 例外が発生した際の処理コードとして、デフォルトの記録処理と組み合わせるのかどうか、各々の例外においてどれくらい共通処理が含まれているのかで、Handlerクラスをカスタマイズするのか、例外クラス内にエラーハンドラ処理コードを記述するのかの切り分けを行えばいいでしょう。

まとめ

 今回は、Laravelアプリケーション内でエラーや例外が発生した際の処理として、エラーハンドラとそのカスタマイズを紹介しました。

 次回は、Laravelのバリデーション機能を紹介します。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
人気のPHPフレームワークLaravelを習得しよう連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook<個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/12130 2020/04/16 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング