SlideShare una empresa de Scribd logo
1 de 20
Descargar para leer sin conexión
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 によるもの
• エラー発生時に所定のフォーマットでログを出力したい
• エラー発生時に所定の slack チャネルに通知を送りたい
• エラー画面のメッセージとログに出力するメッセージを分けたい
19
やりたかったことへの解
report の設定はいじる必要なし
logging の errorlog channel をカスタマイズ
ログ出力したいエラーに abort は使わない
• エラー発生時に所定のフォーマットでログを出力したい
• エラー発生時に所定の slack チャネルに通知を送りたい
• エラー画面のメッセージとログに出力するメッセージを分けたい
20
やりたかったことへの解
エラー画面用メッセージをプロパティとして持った独自例外を定義
render でそのメッセージが表示されるように記述する
※スペースの都合上、名前空間は省略

Más contenido relacionado

La actualidad más candente

Curso de creación de Dashboards Open Source
Curso de creación de Dashboards Open SourceCurso de creación de Dashboards Open Source
Curso de creación de Dashboards Open SourceStratebi
 
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかShohei Okada
 
go_router が隠してくれるもの
go_router が隠してくれるものgo_router が隠してくれるもの
go_router が隠してくれるものcch-robo
 
Java + React.jsでSever Side Rendering #reactjs_meetup
Java + React.jsでSever Side Rendering #reactjs_meetupJava + React.jsでSever Side Rendering #reactjs_meetup
Java + React.jsでSever Side Rendering #reactjs_meetupToshiaki Maki
 
インフラエンジニアってなんでしたっけ(仮)
インフラエンジニアってなんでしたっけ(仮)インフラエンジニアってなんでしたっけ(仮)
インフラエンジニアってなんでしたっけ(仮)Akihiro Kuwano
 
GitとCIとかチャットとかをオンプレで運用する話
GitとCIとかチャットとかをオンプレで運用する話GitとCIとかチャットとかをオンプレで運用する話
GitとCIとかチャットとかをオンプレで運用する話mdome
 
Git Introduction
Git IntroductionGit Introduction
Git IntroductionGareth Hall
 
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTipsKenjiro Kubota
 
Introduction To Git For Version Control Architecture And Common Commands Comp...
Introduction To Git For Version Control Architecture And Common Commands Comp...Introduction To Git For Version Control Architecture And Common Commands Comp...
Introduction To Git For Version Control Architecture And Common Commands Comp...SlideTeam
 
そのRails Engine、 本当に必要ですか?
そのRails Engine、 本当に必要ですか?そのRails Engine、 本当に必要ですか?
そのRails Engine、 本当に必要ですか?nixiesan
 
Responsableを使ったadr実装
Responsableを使ったadr実装Responsableを使ったadr実装
Responsableを使ったadr実装Kenjiro Kubota
 
Is there a way that we can build our Azure Synapse Pipelines all with paramet...
Is there a way that we can build our Azure Synapse Pipelines all with paramet...Is there a way that we can build our Azure Synapse Pipelines all with paramet...
Is there a way that we can build our Azure Synapse Pipelines all with paramet...Erwin de Kreuk
 
SharePoint 開発でできること 2019年9月版
SharePoint 開発でできること 2019年9月版SharePoint 開発でできること 2019年9月版
SharePoint 開発でできること 2019年9月版Hiroaki Oikawa
 
Ruby HTTP clients comparison
Ruby HTTP clients comparisonRuby HTTP clients comparison
Ruby HTTP clients comparisonHiroshi Nakamura
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること信之 岩永
 
Lecture 3: The Role of Enterprise Architecture Practice
Lecture 3: The Role of Enterprise Architecture PracticeLecture 3: The Role of Enterprise Architecture Practice
Lecture 3: The Role of Enterprise Architecture PracticeSvyatoslav Kotusev
 
GraphQL Introduction with Spring Boot
GraphQL Introduction with Spring BootGraphQL Introduction with Spring Boot
GraphQL Introduction with Spring Bootvipin kumar
 

La actualidad más candente (20)

Curso de creación de Dashboards Open Source
Curso de creación de Dashboards Open SourceCurso de creación de Dashboards Open Source
Curso de creación de Dashboards Open Source
 
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。 【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
 
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
 
go_router が隠してくれるもの
go_router が隠してくれるものgo_router が隠してくれるもの
go_router が隠してくれるもの
 
Java + React.jsでSever Side Rendering #reactjs_meetup
Java + React.jsでSever Side Rendering #reactjs_meetupJava + React.jsでSever Side Rendering #reactjs_meetup
Java + React.jsでSever Side Rendering #reactjs_meetup
 
インフラエンジニアってなんでしたっけ(仮)
インフラエンジニアってなんでしたっけ(仮)インフラエンジニアってなんでしたっけ(仮)
インフラエンジニアってなんでしたっけ(仮)
 
GitとCIとかチャットとかをオンプレで運用する話
GitとCIとかチャットとかをオンプレで運用する話GitとCIとかチャットとかをオンプレで運用する話
GitとCIとかチャットとかをオンプレで運用する話
 
Git Introduction
Git IntroductionGit Introduction
Git Introduction
 
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips
 
Introduction To Git For Version Control Architecture And Common Commands Comp...
Introduction To Git For Version Control Architecture And Common Commands Comp...Introduction To Git For Version Control Architecture And Common Commands Comp...
Introduction To Git For Version Control Architecture And Common Commands Comp...
 
Git
GitGit
Git
 
そのRails Engine、 本当に必要ですか?
そのRails Engine、 本当に必要ですか?そのRails Engine、 本当に必要ですか?
そのRails Engine、 本当に必要ですか?
 
Responsableを使ったadr実装
Responsableを使ったadr実装Responsableを使ったadr実装
Responsableを使ったadr実装
 
Is there a way that we can build our Azure Synapse Pipelines all with paramet...
Is there a way that we can build our Azure Synapse Pipelines all with paramet...Is there a way that we can build our Azure Synapse Pipelines all with paramet...
Is there a way that we can build our Azure Synapse Pipelines all with paramet...
 
SharePoint 開発でできること 2019年9月版
SharePoint 開発でできること 2019年9月版SharePoint 開発でできること 2019年9月版
SharePoint 開発でできること 2019年9月版
 
Ruby HTTP clients comparison
Ruby HTTP clients comparisonRuby HTTP clients comparison
Ruby HTTP clients comparison
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
 
Lecture 3: The Role of Enterprise Architecture Practice
Lecture 3: The Role of Enterprise Architecture PracticeLecture 3: The Role of Enterprise Architecture Practice
Lecture 3: The Role of Enterprise Architecture Practice
 
GraphQL Introduction with Spring Boot
GraphQL Introduction with Spring BootGraphQL Introduction with Spring Boot
GraphQL Introduction with Spring Boot
 
Kotlinアンチパターン
KotlinアンチパターンKotlinアンチパターン
Kotlinアンチパターン
 

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

Laravel5.5から6.4にアップグレードしたときに必要だった7つのこと
Laravel5.5から6.4にアップグレードしたときに必要だった7つのことLaravel5.5から6.4にアップグレードしたときに必要だった7つのこと
Laravel5.5から6.4にアップグレードしたときに必要だった7つのことYuta Ohashi
 
Laravelから学びレガシーと闘いはじめた
Laravelから学びレガシーと闘いはじめたLaravelから学びレガシーと闘いはじめた
Laravelから学びレガシーと闘いはじめたYuta Ohashi
 
Laravel4で運用するサービス,そしてlaravel5へ
Laravel4で運用するサービス,そしてlaravel5へLaravel4で運用するサービス,そしてlaravel5へ
Laravel4で運用するサービス,そしてlaravel5へNʎ Nkogues
 
Laravelチュートリアルを作ってみた。
Laravelチュートリアルを作ってみた。Laravelチュートリアルを作ってみた。
Laravelチュートリアルを作ってみた。Futoshi Endo
 
Laravel における Blade 拡張のツラミ
Laravel における Blade 拡張のツラミLaravel における Blade 拡張のツラミ
Laravel における Blade 拡張のツラミShohei Okada
 
Laravel Mix とは何なのか? - Laravel/Vue 勉強会 #1
Laravel Mix とは何なのか? - Laravel/Vue 勉強会 #1Laravel Mix とは何なのか? - Laravel/Vue 勉強会 #1
Laravel Mix とは何なのか? - Laravel/Vue 勉強会 #1Shohei Okada
 
RFC: "var" Deprecation
RFC: "var" DeprecationRFC: "var" Deprecation
RFC: "var" Deprecationy-uti
 
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話Kentarou Takeda
 
フレームワークを使うべき 3 つの理由
フレームワークを使うべき 3 つの理由フレームワークを使うべき 3 つの理由
フレームワークを使うべき 3 つの理由Kenichi Mukai
 
活動報告9 laravel5入門-
活動報告9  laravel5入門-活動報告9  laravel5入門-
活動報告9 laravel5入門-vx-pc-club
 
はじめてLaravelさわった 第86回php勉強会
はじめてLaravelさわった 第86回php勉強会はじめてLaravelさわった 第86回php勉強会
はじめてLaravelさわった 第86回php勉強会Osamu Kawasaki
 
チームで「きちんと」Laravel を使っていくための取り組み
チームで「きちんと」Laravel を使っていくための取り組みチームで「きちんと」Laravel を使っていくための取り組み
チームで「きちんと」Laravel を使っていくための取り組みShohei Okada
 
LaravelとMVCの先へ
LaravelとMVCの先へLaravelとMVCの先へ
LaravelとMVCの先へYuuki Takezawa
 
Laravel5にアップグレードする際に詰まった点
Laravel5にアップグレードする際に詰まった点Laravel5にアップグレードする際に詰まった点
Laravel5にアップグレードする際に詰まった点fagai
 
Laravelとテストについて
LaravelとテストについてLaravelとテストについて
LaravelとテストについてTakeo Noda
 
PHPCON_TOKYO_2022_Bigginer.pptx
PHPCON_TOKYO_2022_Bigginer.pptxPHPCON_TOKYO_2022_Bigginer.pptx
PHPCON_TOKYO_2022_Bigginer.pptxHideo Kashioka
 

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

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

Más de Shohei Okada

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

Más de Shohei Okada (20)

「登壇しているひとは偉い」という話
「登壇しているひとは偉い」という話「登壇しているひとは偉い」という話
「登壇しているひとは偉い」という話
 
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようPHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
 
PHP 8.0 の新記法を試してみよう!
PHP 8.0 の新記法を試してみよう!PHP 8.0 の新記法を試してみよう!
PHP 8.0 の新記法を試してみよう!
 
自分たちのコードを Composer パッケージに分割して開発する
自分たちのコードを Composer パッケージに分割して開発する自分たちのコードを Composer パッケージに分割して開発する
自分たちのコードを Composer パッケージに分割して開発する
 
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #shuuumai
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #shuuumaiクリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #shuuumai
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #shuuumai
 
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawaクリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
 
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpcondo
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpcondoクリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpcondo
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpcondo
 
Laravel でやってみるクリーンアーキテクチャ #phpconfuk
Laravel でやってみるクリーンアーキテクチャ #phpconfukLaravel でやってみるクリーンアーキテクチャ #phpconfuk
Laravel でやってみるクリーンアーキテクチャ #phpconfuk
 
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyoエラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
 
スペシャリストとして組織をつくる、というキャリア
スペシャリストとして組織をつくる、というキャリアスペシャリストとして組織をつくる、というキャリア
スペシャリストとして組織をつくる、というキャリア
 
PHP でも活用できる Makefile
PHP でも活用できる MakefilePHP でも活用できる Makefile
PHP でも活用できる Makefile
 
はじめての Go 言語のプロジェクトを AWS Lambda + API Gateway でやったのでパッケージ構成を晒すよ
はじめての Go 言語のプロジェクトを AWS Lambda + API Gateway でやったのでパッケージ構成を晒すよはじめての Go 言語のプロジェクトを AWS Lambda + API Gateway でやったのでパッケージ構成を晒すよ
はじめての Go 言語のプロジェクトを AWS Lambda + API Gateway でやったのでパッケージ構成を晒すよ
 
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
 
働き方が大きく変わった 入社3年目のときのとあるエピソード
働き方が大きく変わった 入社3年目のときのとあるエピソード働き方が大きく変わった 入社3年目のときのとあるエピソード
働き方が大きく変わった 入社3年目のときのとあるエピソード
 
Laravel で API バージョニングを実装するなら
Laravel で API バージョニングを実装するならLaravel で API バージョニングを実装するなら
Laravel で API バージョニングを実装するなら
 
2017 年度を振り返って ~アウトプット編~
2017 年度を振り返って ~アウトプット編~2017 年度を振り返って ~アウトプット編~
2017 年度を振り返って ~アウトプット編~
 
Laravel × レイヤードアーキテクチャをやってみている話
Laravel × レイヤードアーキテクチャをやってみている話Laravel × レイヤードアーキテクチャをやってみている話
Laravel × レイヤードアーキテクチャをやってみている話
 
プロダクトに 1 から Vue.js を導入した話
プロダクトに 1 から Vue.js を導入した話プロダクトに 1 から Vue.js を導入した話
プロダクトに 1 から Vue.js を導入した話
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
 
The Infamous Hello World Program
The Infamous Hello World ProgramThe Infamous Hello World Program
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 によるもの
  • 18.
  • 19. • エラー発生時に所定のフォーマットでログを出力したい • エラー発生時に所定の slack チャネルに通知を送りたい • エラー画面のメッセージとログに出力するメッセージを分けたい 19 やりたかったことへの解 report の設定はいじる必要なし logging の errorlog channel をカスタマイズ ログ出力したいエラーに abort は使わない
  • 20. • エラー発生時に所定のフォーマットでログを出力したい • エラー発生時に所定の slack チャネルに通知を送りたい • エラー画面のメッセージとログに出力するメッセージを分けたい 20 やりたかったことへの解 エラー画面用メッセージをプロパティとして持った独自例外を定義 render でそのメッセージが表示されるように記述する ※スペースの都合上、名前空間は省略