Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Laravelのエラーハンドリングをカスタマイズする
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kazuhei Arai
December 16, 2020
Programming
510
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Laravelのエラーハンドリングをカスタマイズする
Kazuhei Arai
December 16, 2020
More Decks by Kazuhei Arai
See All by Kazuhei Arai
CTOがプロダクトを管轄して、変わり始めたスクラム開発
kazuhei0108
0
340
Predefined Interfacesを使って便利な独自クラスを作りましょう
kazuhei0108
0
3.1k
LaravelとAWSで_漸進的なプロダクト開発
kazuhei0108
0
170
モックの泥沼から脱却するために、あえてDBにつないでテストしている話
kazuhei0108
4
3.5k
サービスコンテナの実践的な活用
kazuhei0108
1
1.2k
クラスを使ってLaravelのviewをキレイにする
kazuhei0108
1
1.7k
自分のLaravel アプリケーション設計晒す
kazuhei0108
0
99
Composerのstabilityの話
kazuhei0108
0
72
Other Decks in Programming
See All in Programming
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
390
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
320
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
210
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
530
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
6
4k
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
200
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
220
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
1
1.2k
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
500
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.3k
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
240
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
Featured
See All Featured
Deep Space Network (abreviated)
tonyrice
0
170
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
470
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
BBQ
matthewcrist
89
10k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
150
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
44k
sira's awesome portfolio website redesign presentation
elsirapls
0
280
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Evolving SEO for Evolving Search Engines
ryanjones
0
210
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Transcript
!LB[VIFJ !LB[VIFJ@@ -BSBWFMͷΤϥʔϋϯυϦϯάΛ ΧελϚΠζ͢Δ ʲγϡʔϚΠʳ5FDI-FBE&OHJOFFS͔Β࠷৽ٕज़Λֶʂ-BSBWFMฤ
ࣗݾհ ߥҪฏ!LB[VIFJ גࣜձࣾ."Ϋϥυ$50 ീஸງελʔτΞοϓ
ς Ϋ ϊ ϩ δ ʔ ͷ ྗ Ͱ M
& A ʹ ྲྀ ௨ ֵ ໋ Λ
."ͷϦΫφϏͷΑ͏ͳαʔϏε ങ͍खاۀ͕ങऩχʔζΛܝࡌ͠ɺ ചΓख͕ͦΕʹରͯ͠ਃ͠ࠐΉͱ͍͏ܗͷ ৽͍͠.ˍ"ϚονϯάϓϥοτϑΥʔϜ
͍ͬͯΔٕज़ɾπʔϧ GSPOUFOE CBDLFOE NJEEMFXBSF JOGSB UPPMT
None
࣍ w 1)1ͷ&YDFQUJPO w -BSBWFMͷϦΫΤετ͔ΒϨεϙϯε·ͰͷྲྀΕ w ΤϥʔϋϯυϦϯάͷྲྀΕ w ΧελϚΠζྫ w
·ͱΊ
1)1ͷ&YDFQUJPO
1)1ͷ&YDFQUJPO 1)1ʹ&YDFQUJPOͱ&SSPSͷछྨͷྫ֎͕͋Γ·͢ɻ ྆ํͱ͕5ISPXBCMFΛܧঝ͍ͯ͠·͢ɻ 5ISPXBCMF &SSPS &YDFQUJPO 5ZQF&SSPS 3VOUJNF&YDFQUJPO &SSPS&YDFQUJPO "SJUINFUJD&SSPS
1)1ͷ&YDFQUJPO &SSPS&YDFQUJPOͱ͍͏͔ΓͮΒ͍ͷ͋Γ·͕͢ɺ ͜Ε&YDFQUJPOͰ͢ɻޙͰग़͖ͯ·͢ɻ 5ISPXBCMF &SSPS &YDFQUJPO 5ZQF&SSPS 3VOUJNF&YDFQUJPO &SSPS&YDFQUJPO "SJUINFUJD&SSPS
1)1ͷ&YDFQUJPO 1)1ͷݴޠϨϕϧͰͷΤϥʔେ͕&SSPSΛܧঝ͍ͯ͠· ͢ɻΑͬͯUSZDBUDIͰ&YDFQUJPOͱͯ͠DBUDI͠Α͏ͱͯ͠ ΩϟονͰ͖·ͤΜɻ 5ISPXBCMF &SSPS &YDFQUJPO 5ZQF&SSPS 3VOUJNF&YDFQUJPO &SSPS&YDFQUJPO
"SJUINFUJD&SSPS
1)1ͷ&YDFQUJPO &SSPS&YDFQUJPOͰͳ͍ͷͰ5ISPXBCMFͱͯ͠$BUDI <?php /** * Handle an incoming HTTP request.
* * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function handle($request) { try { throw new SomeException(); } catch (Exception $e) { // ExceptionͷΈCatch } catch (Throwable $e) { // ExceptionͱErrorͷ྆ํΛCatch } }
-BSBWFMͷ ΤϥʔϋϯυϦϯάͷྲྀΕ
ΤϥʔϋϯυϦϯά·ͰͷྲྀΕ ͥͻ͓खݩͷ1)14UPSN͔Կ͔Ͱ-BSBWFMͷ1SPKFDUΛ։͍ ͯɺϑΝΠϧΛݟͳ͕Βฉ͍ͯΈ͍ͯͩ͘͞ɻ
ΤϥʔϋϯυϦϯά·ͰͷྲྀΕ QVCMJDJOEFYQIQͰ,FSOFMΛੜ͠,FSOFMIBOEMF Λ࣮ߦ <?php /** * Laravel - A PHP
Framework For Web Artisans * * @package Laravel * @author Taylor Otwell <
[email protected]
> */ define('LARAVEL_START', microtime(true)); /** ུ **/ $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); $response = $kernel->handle( $request = Illuminate\Http\Request::capture() ); $response->send(); $kernel->terminate($request, $response);
ΤϥʔϋϯυϦϯά·ͰͷྲྀΕ *MMVNJOBUFa'PVOEBUJPOa)UUQa,FSOFMIBOEMFͰ &YDFQUJPOɺ5ISPXBCMFΛर͏ <?php /** লུ **/ public function handle($request)
{ try { $request->enableHttpMethodParameterOverride(); $response = $this->sendRequestThroughRouter($request); } catch (Exception $e) { $this->reportException($e); $response = $this->renderException($request, $e); } catch (Throwable $e) { $this->reportException($e = new FatalThrowableError($e)); $response = $this->renderException($request, $e); } $this->app['events']->dispatch( new RequestHandled($request, $response) ); return $response; }
ΤϥʔϋϯυϦϯά·ͰͷྲྀΕ &SSPS'BUBM5ISPXBCMF&SSPSͱ͍͏໊લͷ &SSPS&YDFQUJPOʹม͍ͯ͠Δ <?php /** লུ **/ public function handle($request)
{ try { $request->enableHttpMethodParameterOverride(); $response = $this->sendRequestThroughRouter($request); } catch (Exception $e) { $this->reportException($e); $response = $this->renderException($request, $e); } catch (Throwable $e) { $this->reportException($e = new FatalThrowableError($e)); $response = $this->renderException($request, $e); } $this->app['events']->dispatch( new RequestHandled($request, $response) ); return $response; }
ΤϥʔϋϯυϦϯά·ͰͷྲྀΕ ͭ·Γɺ-BSBWFMͷ࣮ߦ࣌ʹൃੜͨ͠&SSPS࠷ऴతʹ શͯ&YDFQUJPOʹม͞Ε͔ͯΒॲཧ͞ΕΔ <?php /** লུ **/ public function handle($request)
{ try { $request->enableHttpMethodParameterOverride(); $response = $this->sendRequestThroughRouter($request); } catch (Exception $e) { $this->reportException($e); $response = $this->renderException($request, $e); } catch (Throwable $e) { $this->reportException($e = new FatalThrowableError($e)); $response = $this->renderException($request, $e); } $this->app['events']->dispatch( new RequestHandled($request, $response) ); return $response; }
ΤϥʔϋϯυϦϯά·ͰͷྲྀΕ <?php /** লུ **/ /** * Report the exception
to the exception handler. * * @param \Exception $e * @return void */ protected function reportException(Exception $e) { $this->app[ExceptionHandler::class]->report($e); } /** * Render the exception to a response. * * @param \Illuminate\Http\Request $request * @param \Exception $e * @return \Symfony\Component\HttpFoundation\Response */ protected function renderException($request, Exception $e) { return $this->app[ExceptionHandler::class]->render($request, $e); } ΤϥʔϋϯυϦϯά&YDFQUJPO)BOEMFSDMBTTͷ࣮͕ߦ͏
ΤϥʔϋϯυϦϯά·ͰͷྲྀΕ <?php /** লུ **/ $app->singleton( Illuminate\Contracts\Debug\ExceptionHandler::class, App\Exceptions\Handler::class ); return
$app; &YDFQUJPO)BOEMFSDMBTTͷ࣮ CPPUTUSBQBQQQIQͰࢦఆ͞Ε͍ͯΔ
ΤϥʔϋϯυϦϯάͷྲྀΕ
ΤϥʔϋϯυϦϯάͷྲྀΕ ΤϥʔϋϯυϦϯάͷྲྀΕେ͖͘ ɾΤϥʔϨϙʔτ ɾΤϥʔදࣔ ͷͭͷϑΣʔζʹ͔Ε͍ͯ·͢ɻ͜ΕΒ *MMVNJOBUFa'PVOEBUJPOa&YDFQUJPOTa)BOEMFSQIQʹ࣮ ͞Ε͍ͯ·͢ɻ
ΤϥʔϋϯυϦϯάͷྲྀΕ )BOEMFSSFQPSU ԿΛϨϙʔτ͢Δ͔ܾΊΔ Ϩϙʔτ͢Δ &YDFQUJPOΛ४උ͢Δ &YDFQUJPOΛදࣔ͢Δ )BOEMFSSFOEFS
ΤϥʔϋϯυϦϯάͷྲྀΕ )BOEMFSSFQPSU )BOEMFSTIPVMEOU3FQPSU MPHHFSFSSPS )BOEMFSQSFQBSF&YDFQUJPO )BOEMFSQSFQBSF3FTQPOTF )BOEMFSSFOEFS
ΤϥʔϋϯυϦϯάͷྲྀΕ <?php /** লུ **/ protected function prepareResponse($request, Exception $e)
{ if (! $this->isHttpException($e) && config('app.debug')) { return $this->toIlluminateResponse($this- >convertExceptionToResponse($e), $e); } if (! $this->isHttpException($e)) { $e = new HttpException(500, $e->getMessage()); } return $this->toIlluminateResponse( $this->renderHttpException($e), $e ); } σϑΥϧτͷQSFQBSF3FTQPOTFʹ&YDFQUJPOΛड͚औͬͯ ඳը͢Δ࠷ݶͷॲཧ͕ॻ͍ͯ͋Δ
ΤϥʔϋϯυϦϯάͷྲྀΕ 4ZNGPOZa$PNQPOFOUa)UUQ,FSOFMa&YDFQUJPOa)UUQ&YDFQUJPOΛܧ ঝ͍ͯ͠ΔΫϥεશͯJT)UUQ&YDFQUJPOʹ֘͠ɺ-BSBWFM͕͍͍ײ ͡ʹมͯ͘͠Ε·͢ɻ ྫ/PU'PVOE)UUQ&YDFQUJPO #BE3FRVFTU)UUQ&YDFQUJPO
ΤϥʔϋϯυϦϯάͷྲྀΕ ͜ΕΒͷॲཧͱͱ *MMVNJOBUFa'PVOEBUJPOa&YDFQUJPOTa)BOEMFSQIQʹ࣮͞ Ε͍ͯ·͕͢ɺ"QQa&YDFQUJPOTa)BOEMFSQIQ͕ܧঝؔ ʹ͋ΔͷͰ؆୯ʹ্ॻ͖͢Δ͜ͱ͕ՄೳͰ͢ɻ
ΧελϚΠζྫ
ΧελϚΠζྫ w ಛఆͷ&YDFQUJPOΛϩάʹग़͞ͳ͘͢Δ w ಠࣗͷ&YDFQUJPOͰطଘͷΤϥʔදࣔΛ͢Δ w ΤϥʔදࣔͷWJFXΛΧελϚΠζ͢Δ
ಛఆͷ&YDFQUJPOΛϩάʹग़͞ͳ͘͢Δ )BOEMFSSFQPSU )BOEMFSTIPVMEOU3FQPSU MPHHFSFSSPS )BOEMFSQSFQBSF&YDFQUJPO )BOEMFSQSFQBSF3FTQPOTF )BOEMFSSFOEFS
ಛఆͷ&YDFQUJPOΛϩάʹग़͞ͳ͘͢Δ EPOU3FQPSUΛࢦఆͯ͠ϩάʹग़͞ͳ͍ <?php namespace Illuminate\Foundation\Exceptions; /** ུ **/ class Handler
extends ExceptionHandler { /** ུ **/ protected function shouldntReport(Exception $e) { $dontReport = array_merge($this->dontReport, $this->internalDontReport); return ! is_null(Arr::first($dontReport, function ($type) use ($e) { return $e instanceof $type; })); }
ಛఆͷ&YDFQUJPOΛϩάʹग़͞ͳ͘͢Δ EPOU3FQPSUΛࢦఆͯ͠ϩάʹग़͞ͳ͍ <?php namespace App\Exceptions; /** ུ **/ class Handler
extends ExceptionHandler { /** * A list of the exception types that are not reported. * * @var array */ protected $dontReport = [ PreconditionException::class, NotFoundException::class, ];
ಠࣗͷ&YDFQUJPOͰطଘͷΤϥʔදࣔΛ͢Δ )BOEMFSSFQPSU )BOEMFSTIPVMEOU3FQPSU MPHHFSFSSPS )BOEMFSQSFQBSF&YDFQUJPO )BOEMFSQSFQBSF3FTQPOTF )BOEMFSSFOEFS
ಠࣗͷ&YDFQUJPOͰطଘͷΤϥʔදࣔΛ͢Δ )UUQ&YDFQUJPOΛܧঝͨ͠Ϋϥεʹม͢Δ <?php namespace App\Exceptions; /** ུ **/ class Handler
extends ExceptionHandler { protected function prepareException(Exception $e) { $e = parent::prepareException($e); if ($e instanceof NotFoundException) { $e = new NotFoundHttpException($e->getMessage(), $e); } if ($e instanceof PreconditionException) { $e = new AccessDeniedHttpException($e->getMessage(), $e); } return $e; }
ΤϥʔදࣔͷWJFXΛΧελϚΠζ͢Δ )BOEMFSSFQPSU )BOEMFSTIPVMEOU3FQPSU MPHHFSFSSPS )BOEMFSQSFQBSF&YDFQUJPO )BOEMFSQSFQBSF3FTQPOTF )BOEMFSSFOEFS
ΤϥʔදࣔͷWJFXΛΧελϚΠζ͢Δ <?php namespace App\Exceptions; /** ུ **/ class Handler extends
ExceptionHandler { protected function prepareResponse($request, Exception $e) { return $this->toIlluminateResponse( $this->customRenderHttpException($request, $e), $e ); } private function customRenderHttpException(Request $request, HttpException $e) { $status = $e->getStatusCode(); $paths = collect(config('view.paths')); view()->replaceNamespace('errors', $paths->map(function ($path) use ($request) { if ($request->is('admin/*')) { return "{$path}/admin/errors"; } return "{$path}/service/errors"; })->push(__DIR__ . '/views')->all()); if (view()->exists($view = "errors::{$status}")) { return response()->view($view, ['exception' => $e], $status, $e->getHeaders()); } return $this->convertExceptionToResponse($e); }
·ͱΊ
·ͱΊ -BSBWFMͷΤϥʔϋϯυϦϯάͭͷϑΣʔζʹ͔Ε͓ͯ ΓɺͦΕͧΕܧঝՄೳͳؔͰ࣮͞Ε͍ͯΔͨΊɺBQQ &YDFQUJPO)BOEMFSQIQΛॻ͖͑Δ͚ͩͰɺ༷ʑͳ݅ʹ ߹ΘͤͯΧελϚΠζ͢Δ͜ͱ͕ՄೳͰ͢ʂ