SlideShare a Scribd company logo
Laravel 5.6 デフォルトの
例外ハンドリング処理を
まとめてみた
Laravel/Vue.js 勉強会 #4
#laravue ですが
今回は Laravel オンリーの
おなはしです
おことわり
岡田 正平(おかだ しょうへい)@okashoi
• 株式会社ウィルゲート 2015年新卒入社
• 開発室 ソリューションユニット 所属
• PHP, Laravel, Vue.js
3
自己紹介
Slides:
Laravel 5.6 にて
• エラー発生時に所定のフォーマットでログを出力したい
• エラー発生時に所定の slack チャネルに通知を送りたい
• エラー画面のメッセージとログに出力するメッセージを分けたい
4
(背景)やりたかったこと
5
(アプリケーション内で)catch されなかった例外に対する処理を
App¥Exceptions¥Handler に記述すればよさそう
• report: ロギングに関する設定
• render: どのようなレスポンスを返すかの設定
> All exceptions are handled by the App¥Exceptions¥Handler class. This class contains
two methods: report and render. (中略) The report method is used to log exceptions
or send them to an external service like Bugsnag or Sentry. (中略) The render method
is responsible for converting a given exception into an HTTP response that should be sent
back to the browser.
6
よっしゃ、設定するぜ! .
よっしゃ、設定するぜ! .
……
?
• エラーの種類によってログが出力されたりされなかったり、
どうやって実現しているの?
• 結局どのエラーがログ出力されないの?
• したときは report されるの?
• バリデーションエラーのときの挙動はどうやって実現しているの?
10
ところで、デフォルトでは何をやってるのよ?
abort()
まとめてみた
1. 指定された例外については何もせずに終了
• カスタマイズ可能な App¥Exceptions¥Hander の $dontreport に加え
基底クラス Illuminate¥Foundation¥Exceptions¥Handler には
$internalDontReport
2. 例外自信が report() メソッドを持っていたら
優先的にそちらの処理を行って終了
3. それ以外は $logger->error() でログ出力
12
のデフォルトの挙動report()
protected $internalDontReport = [
AuthenticationException::class,
AuthorizationException::class,
HttpException::class,
HttpResponseException::class,
ModelNotFoundException::class,
TokenMismatchException::class,
ValidationException::class,
];
report()
1. 指定された例外については何もせずに終了
• カスタマイズ可能な App¥Exceptions¥Hander の $dontreport に加え
基底クラス Illuminate¥Foundation¥Exceptions¥Handler には
$internalDontReport
2. 例外自信が report() メソッドを持っていたら
優先的にそちらの処理を行って終了
3. それ以外は $logger->error() でログ出力
13
のデフォルトの挙動report()
protected $internalDontReport = [
AuthenticationException::class,
AuthorizationException::class,
HttpException::class,
HttpResponseException::class,
ModelNotFoundException::class,
TokenMismatchException::class,
ValidationException::class,
];
report()
• の中身は HttpException を送出しているだけ
• artisan down によるメンテナンスモードのときは投げられた例外が
最終的に ServiceUnavailableHttpException に変換される
➢ 結果、どちらも report されない
14
のデフォルトの挙動report()report()
abort()
※スペースの都合上、名前空間は省略
1. 例外自身が render 可能なら優先的にそちらを利用して終了
2. 特定の例外を変換
3. 特定の例外については専用の処理を行って終了
例) ValidationException → json レスポンスならエラーレスポンスを返す
そうでなければ前の画面にリダイレクト
4. json レスポンスならエラーレスポンスを返す or
デバッグモードなら詳細表示 or
例外を HttpException に変換してエラー画面を描画
15
のデフォルトの挙動(ざっくり)report()render()
※スペースの都合上、名前空間は省略
1. 例外自身が render 可能なら優先的にそちらを利用して終了
2. 特定の例外を変換
3. 特定の例外については専用の処理を行って終了
例) ValidationException → json レスポンスならエラーレスポンスを返す
そうでなければ前の画面にリダイレクト
4. json レスポンスならエラーレスポンスを返す or
デバッグモードなら詳細表示 or
例外を HttpException に変換してエラー画面を描画
16
のデフォルトの挙動(ざっくり)report()render()
※スペースの都合上、名前空間は省略
protected function prepareException(Exception $e)
{
if ($e instanceof ModelNotFoundException) {
$e = new NotFoundHttpException($e->getMessage(), $e);
} elseif ($e instanceof AuthorizationException) {
$e = new AccessDeniedHttpException($e->getMessage(), $e);
} elseif ($e instanceof TokenMismatchException) {
$e = new HttpException(419, $e->getMessage(), $e);
}
return $e;
}
1. 例外自身が render 可能なら優先的にそちらを利用して終了
2. 特定の例外を変換
3. 特定の例外については専用の処理を行って終了
例) ValidationException → json レスポンスならエラーレスポンスを返す
そうでなければ前の画面にリダイレクト
4. json レスポンスならエラーレスポンスを返す or
デバッグモードなら詳細表示 or
例外を HttpException に変換してエラー画面を描画
17
のデフォルトの挙動(ざっくり)report()render()
※スペースの都合上、名前空間は省略
→バリデーションエラーのときに
「よしなに」やってくれる挙動は render によるもの
Laravel 5.6 デフォルトの例外ハンドリング処理をまとめてみた
• エラー発生時に所定のフォーマットでログを出力したい
• エラー発生時に所定の slack チャネルに通知を送りたい
• エラー画面のメッセージとログに出力するメッセージを分けたい
19
やりたかったことへの解
report の設定はいじる必要なし
logging の errorlog channel をカスタマイズ
ログ出力したいエラーに abort は使わない
• エラー発生時に所定のフォーマットでログを出力したい
• エラー発生時に所定の slack チャネルに通知を送りたい
• エラー画面のメッセージとログに出力するメッセージを分けたい
20
やりたかったことへの解
エラー画面用メッセージをプロパティとして持った独自例外を定義
render でそのメッセージが表示されるように記述する
※スペースの都合上、名前空間は省略

More Related Content

PDF
Hardware Acceleration in WebKit
PDF
Laravel の paginate は一体何をやっているのか
PDF
Docker Introduction
PDF
traitを使って楽したい話
PDF
Kernel Recipes 2017 - Understanding the Linux kernel via ftrace - Steven Rostedt
PDF
サーバーサイドでの非同期処理で色々やったよ
PPTX
Docker 101 - Nov 2016
Hardware Acceleration in WebKit
Laravel の paginate は一体何をやっているのか
Docker Introduction
traitを使って楽したい話
Kernel Recipes 2017 - Understanding the Linux kernel via ftrace - Steven Rostedt
サーバーサイドでの非同期処理で色々やったよ
Docker 101 - Nov 2016

What's hot (20)

PPTX
Nmapの真実(続)
PPTX
T119_5年間の試行錯誤で進化したMVPVMパターン
PPTX
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
PDF
ELFの動的リンク
PDF
BPF / XDP 8월 세미나 KossLab
PPT
Springを使ったwebアプリにリファクタリングしよう
PDF
Alphorm.com Formation Kubernetes : Installation et Configuration
ODP
Base NoSql et Python
PDF
Docker internals
PPTX
Requirement diagram
PPTX
エンジニアライクにドキュメントを作成してみた件
PDF
Abusing Symlinks on Windows
PDF
SSH力をつかおう
PDF
Building Network Functions with eBPF & BCC
PDF
flaws.cloudに挑戦しよう!
PDF
Polymorphisme (cours, résumé)
PPTX
Comprehensive Terraform Training
PPTX
Modele mvc
PDF
Alphorm.com Formation Elastic : Maitriser les fondamentaux
PPTX
Reusable, composable, battle-tested Terraform modules
Nmapの真実(続)
T119_5年間の試行錯誤で進化したMVPVMパターン
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ELFの動的リンク
BPF / XDP 8월 세미나 KossLab
Springを使ったwebアプリにリファクタリングしよう
Alphorm.com Formation Kubernetes : Installation et Configuration
Base NoSql et Python
Docker internals
Requirement diagram
エンジニアライクにドキュメントを作成してみた件
Abusing Symlinks on Windows
SSH力をつかおう
Building Network Functions with eBPF & BCC
flaws.cloudに挑戦しよう!
Polymorphisme (cours, résumé)
Comprehensive Terraform Training
Modele mvc
Alphorm.com Formation Elastic : Maitriser les fondamentaux
Reusable, composable, battle-tested Terraform modules
Ad

Similar to Laravel 5.6 デフォルトの例外ハンドリング処理をまとめてみた (20)

PDF
Laravel5.5から6.4にアップグレードしたときに必要だった7つのこと
PDF
Laravelから学びレガシーと闘いはじめた
PDF
Laravel4で運用するサービス,そしてlaravel5へ
PPTX
Laravelチュートリアルを作ってみた。
PDF
Laravel5.1 Release
PDF
Laravel における Blade 拡張のツラミ
PDF
Laravel Mix とは何なのか? - Laravel/Vue 勉強会 #1
PDF
RFC: "var" Deprecation
PDF
OSC福岡 20111203
PDF
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
PDF
フレームワークを使うべき 3 つの理由
PPTX
転職とLaravel
PPTX
活動報告9 laravel5入門-
PDF
はじめてLaravelさわった 第86回php勉強会
PDF
チームで「きちんと」Laravel を使っていくための取り組み
PDF
LaravelとMVCの先へ
PDF
Laravel5にアップグレードする際に詰まった点
PDF
Laravelとテストについて
PPTX
PHPCON_TOKYO_2022_Bigginer.pptx
PDF
3 tips of Laravel
Laravel5.5から6.4にアップグレードしたときに必要だった7つのこと
Laravelから学びレガシーと闘いはじめた
Laravel4で運用するサービス,そしてlaravel5へ
Laravelチュートリアルを作ってみた。
Laravel5.1 Release
Laravel における Blade 拡張のツラミ
Laravel Mix とは何なのか? - Laravel/Vue 勉強会 #1
RFC: "var" Deprecation
OSC福岡 20111203
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
フレームワークを使うべき 3 つの理由
転職とLaravel
活動報告9 laravel5入門-
はじめてLaravelさわった 第86回php勉強会
チームで「きちんと」Laravel を使っていくための取り組み
LaravelとMVCの先へ
Laravel5にアップグレードする際に詰まった点
Laravelとテストについて
PHPCON_TOKYO_2022_Bigginer.pptx
3 tips of Laravel
Ad

More from Shohei Okada (20)

PDF
「登壇しているひとは偉い」という話
PDF
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PDF
PHP 8.0 の新記法を試してみよう!
PDF
自分たちのコードを Composer パッケージに分割して開発する
PDF
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #shuuumai
PDF
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
PDF
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpcondo
PDF
Laravel でやってみるクリーンアーキテクチャ #phpconfuk
PDF
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
PDF
スペシャリストとして組織をつくる、というキャリア
PDF
PHP でも活用できる Makefile
PDF
はじめての Go 言語のプロジェクトを AWS Lambda + API Gateway でやったのでパッケージ構成を晒すよ
PDF
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
PDF
働き方が大きく変わった 入社3年目のときのとあるエピソード
PDF
Laravel で API バージョニングを実装するなら
PDF
2017 年度を振り返って ~アウトプット編~
PDF
Laravel × レイヤードアーキテクチャをやってみている話
PDF
プロダクトに 1 から Vue.js を導入した話
PDF
PHP 2大 web フレームワークの徹底比較!
PDF
The Infamous Hello World Program
「登壇しているひとは偉い」という話
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP 8.0 の新記法を試してみよう!
自分たちのコードを Composer パッケージに分割して開発する
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #shuuumai
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpcondo
Laravel でやってみるクリーンアーキテクチャ #phpconfuk
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
スペシャリストとして組織をつくる、というキャリア
PHP でも活用できる Makefile
はじめての Go 言語のプロジェクトを AWS Lambda + API Gateway でやったのでパッケージ構成を晒すよ
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
働き方が大きく変わった 入社3年目のときのとあるエピソード
Laravel で API バージョニングを実装するなら
2017 年度を振り返って ~アウトプット編~
Laravel × レイヤードアーキテクチャをやってみている話
プロダクトに 1 から Vue.js を導入した話
PHP 2大 web フレームワークの徹底比較!
The Infamous Hello World Program

Laravel 5.6 デフォルトの例外ハンドリング処理をまとめてみた

  • 2. #laravue ですが 今回は Laravel オンリーの おなはしです おことわり
  • 3. 岡田 正平(おかだ しょうへい)@okashoi • 株式会社ウィルゲート 2015年新卒入社 • 開発室 ソリューションユニット 所属 • PHP, Laravel, Vue.js 3 自己紹介 Slides:
  • 4. Laravel 5.6 にて • エラー発生時に所定のフォーマットでログを出力したい • エラー発生時に所定の slack チャネルに通知を送りたい • エラー画面のメッセージとログに出力するメッセージを分けたい 4 (背景)やりたかったこと
  • 5. 5
  • 6. (アプリケーション内で)catch されなかった例外に対する処理を App¥Exceptions¥Handler に記述すればよさそう • report: ロギングに関する設定 • render: どのようなレスポンスを返すかの設定 > All exceptions are handled by the App¥Exceptions¥Handler class. This class contains two methods: report and render. (中略) The report method is used to log exceptions or send them to an external service like Bugsnag or Sentry. (中略) The render method is responsible for converting a given exception into an HTTP response that should be sent back to the browser. 6
  • 9.
  • 10. • エラーの種類によってログが出力されたりされなかったり、 どうやって実現しているの? • 結局どのエラーがログ出力されないの? • したときは report されるの? • バリデーションエラーのときの挙動はどうやって実現しているの? 10 ところで、デフォルトでは何をやってるのよ? abort()
  • 12. 1. 指定された例外については何もせずに終了 • カスタマイズ可能な App¥Exceptions¥Hander の $dontreport に加え 基底クラス Illuminate¥Foundation¥Exceptions¥Handler には $internalDontReport 2. 例外自信が report() メソッドを持っていたら 優先的にそちらの処理を行って終了 3. それ以外は $logger->error() でログ出力 12 のデフォルトの挙動report() protected $internalDontReport = [ AuthenticationException::class, AuthorizationException::class, HttpException::class, HttpResponseException::class, ModelNotFoundException::class, TokenMismatchException::class, ValidationException::class, ]; report()
  • 13. 1. 指定された例外については何もせずに終了 • カスタマイズ可能な App¥Exceptions¥Hander の $dontreport に加え 基底クラス Illuminate¥Foundation¥Exceptions¥Handler には $internalDontReport 2. 例外自信が report() メソッドを持っていたら 優先的にそちらの処理を行って終了 3. それ以外は $logger->error() でログ出力 13 のデフォルトの挙動report() protected $internalDontReport = [ AuthenticationException::class, AuthorizationException::class, HttpException::class, HttpResponseException::class, ModelNotFoundException::class, TokenMismatchException::class, ValidationException::class, ]; report()
  • 14. • の中身は HttpException を送出しているだけ • artisan down によるメンテナンスモードのときは投げられた例外が 最終的に ServiceUnavailableHttpException に変換される ➢ 結果、どちらも report されない 14 のデフォルトの挙動report()report() abort() ※スペースの都合上、名前空間は省略
  • 15. 1. 例外自身が render 可能なら優先的にそちらを利用して終了 2. 特定の例外を変換 3. 特定の例外については専用の処理を行って終了 例) ValidationException → json レスポンスならエラーレスポンスを返す そうでなければ前の画面にリダイレクト 4. json レスポンスならエラーレスポンスを返す or デバッグモードなら詳細表示 or 例外を HttpException に変換してエラー画面を描画 15 のデフォルトの挙動(ざっくり)report()render() ※スペースの都合上、名前空間は省略
  • 16. 1. 例外自身が render 可能なら優先的にそちらを利用して終了 2. 特定の例外を変換 3. 特定の例外については専用の処理を行って終了 例) ValidationException → json レスポンスならエラーレスポンスを返す そうでなければ前の画面にリダイレクト 4. json レスポンスならエラーレスポンスを返す or デバッグモードなら詳細表示 or 例外を HttpException に変換してエラー画面を描画 16 のデフォルトの挙動(ざっくり)report()render() ※スペースの都合上、名前空間は省略 protected function prepareException(Exception $e) { if ($e instanceof ModelNotFoundException) { $e = new NotFoundHttpException($e->getMessage(), $e); } elseif ($e instanceof AuthorizationException) { $e = new AccessDeniedHttpException($e->getMessage(), $e); } elseif ($e instanceof TokenMismatchException) { $e = new HttpException(419, $e->getMessage(), $e); } return $e; }
  • 17. 1. 例外自身が render 可能なら優先的にそちらを利用して終了 2. 特定の例外を変換 3. 特定の例外については専用の処理を行って終了 例) ValidationException → json レスポンスならエラーレスポンスを返す そうでなければ前の画面にリダイレクト 4. json レスポンスならエラーレスポンスを返す or デバッグモードなら詳細表示 or 例外を HttpException に変換してエラー画面を描画 17 のデフォルトの挙動(ざっくり)report()render() ※スペースの都合上、名前空間は省略 →バリデーションエラーのときに 「よしなに」やってくれる挙動は render によるもの
  • 19. • エラー発生時に所定のフォーマットでログを出力したい • エラー発生時に所定の slack チャネルに通知を送りたい • エラー画面のメッセージとログに出力するメッセージを分けたい 19 やりたかったことへの解 report の設定はいじる必要なし logging の errorlog channel をカスタマイズ ログ出力したいエラーに abort は使わない
  • 20. • エラー発生時に所定のフォーマットでログを出力したい • エラー発生時に所定の slack チャネルに通知を送りたい • エラー画面のメッセージとログに出力するメッセージを分けたい 20 やりたかったことへの解 エラー画面用メッセージをプロパティとして持った独自例外を定義 render でそのメッセージが表示されるように記述する ※スペースの都合上、名前空間は省略