「効かない!」依存性注入(DI)を活用したAPI Platformのエラーハンドリング奮闘記
by
Maki Hayashi
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
「効かない!」 依存性注入(DI)を活用した API Platformの エラーハンドリング奮闘記 まきまき 2026/03/22 PHPerKaigi 2026 1
Slide 2
Slide 2 text
2 フレームワークのカスタムしたい箇所が 思い通りにカスタムできず モヤモヤしたことはありますか?
Slide 3
Slide 3 text
3 API Platform初心者の私が API Platformでうまくカスタムできず、 モヤモヤした話をします
Slide 4
Slide 4 text
まきまき @_mkmk884 愛媛→京都→小田原→横浜 コネヒト株式会社 Webエンジニア PHPカンファレンス小田原 2026/04/11 PHPカンファレンス愛媛 2026/10/03 のコアスタッフ 4
Slide 5
Slide 5 text
API Platform 5 ● WebAPIの開発に特化した PHP向けのフルスタックフレームワーク ● Symfonyコンポーネントをベースとしている ● アトリビュートを1行記載するだけでREST APIを作成可能 ● 仕様(OpenAPI/Swagger)やドキュメント が自動生成される
Slide 6
Slide 6 text
やっていたこと 6 ● Laravel + API Platform for Laravel を用いて開発 ○ Laravelプロジェクトの上にAPI Platformの機能を 乗せることができる ● エンドポイントを叩かれたら、処理を実行して結果を 返却する役割
Slide 7
Slide 7 text
やりたかったこと 7 すべてのエンドポイントの 例外時のレスポンスを 3種類に固定したい
Slide 8
Slide 8 text
やりたかったこと 8 クライアント側の バリデーションエラー等 システム内部の データ整合性エラー等 DB接続エラー、 APIタイムアウト等
Slide 9
Slide 9 text
9 Laravelのプロジェクトだから Laravelの例外ハンドラーに 書こう 💡
Slide 10
Slide 10 text
やってみた① withExceptionsに例外を記載 10 bootstrap/app.php
Slide 11
Slide 11 text
やってみた① withExceptionsに例外を記載 11 bootstrap/app.php Laravel標準の汎用例外ハンドラー アプリケーション全体の 例外ハンドリング動作を一括設定できる
Slide 12
Slide 12 text
やってみた① withExceptionsに例外を記載 12 bootstrap/app.php カスタムしたい 例外処理を入れた
Slide 13
Slide 13 text
13 効かない! 💧 withExceptionsに記載した内容で返されてない…
Slide 14
Slide 14 text
14 API Platformからレスポンスが 出ていくところに割り込みで書こう 💦
Slide 15
Slide 15 text
やってみた② 例外処理のリスナーを設定する 15 カスタムしたい例外処理 のリスナーを作成
Slide 16
Slide 16 text
やってみた② 例外処理のリスナーを設定する 16 API Platform内部で 用いているSymfony に対して割り込み
Slide 17
Slide 17 text
やってみた② 例外処理のリスナーを設定する 17 カスタムしたい 例外処理を入れた
Slide 18
Slide 18 text
やってみた② 例外処理のリスナーを設定する 18 api/php/app/Providers/EventServiceProvider.php api/php/bootstrap/providers.php 作成したリスナー を設定
Slide 19
Slide 19 text
19 💧 Listenerに記載した内容で返されてない… 💧 効かない〜〜〜!
Slide 20
Slide 20 text
API Platformのソースコードを確認 20 ※ 当時のソースコード(現在は少し変わってます) ApiPlatformDeferredProvider.php
Slide 21
Slide 21 text
API Platformのソースコードを確認 21 ※ 当時のソースコード(現在は少し変わってます) ApiPlatformDeferredProvider.php ExceptionHandler クラスに従う
Slide 22
Slide 22 text
API Platformのソースコードを確認 22 ※ 当時のソースコード(現在は少し変わってます) API Platformの ErrorHandlerクラス がラップ ApiPlatformDeferredProvider.php
Slide 23
Slide 23 text
API Platformのソースコードを確認 23 ※ 当時のソースコード(現在は少し変わってます) Decorator パターン 既存の例外ハンドラ をラップすることで 拡張している ApiPlatformDeferredProvider.php
Slide 24
Slide 24 text
24 これを自作に置き換えれば……! 💡 💡 ApiPlatformDeferredProvider.php
Slide 25
Slide 25 text
25 これはッ!DIコンテナの出番だー! 💡 💡 ApiPlatformDeferredProvider.php
Slide 26
Slide 26 text
例外ハンドラーを作成して注入 26
Slide 27
Slide 27 text
例外ハンドラーを作成して注入 27 ErrorHandlerを継承
Slide 28
Slide 28 text
例外ハンドラーを作成して注入 28 カスタムしたい例外 を入れる
Slide 29
Slide 29 text
例外ハンドラーを作成して注入 29 ErrorHandlerを継承 した独自ハンドラー を作成
Slide 30
Slide 30 text
例外ハンドラーを作成して注入 30 例外処理の主導権を 自作クラスが持つ ことができる Laravel標準の ExceptionHandlerを 自作クラスへ差し替え
Slide 31
Slide 31 text
31 \ レスポンス /
Slide 32
Slide 32 text
32 やりたい拡張ができた!!!
Slide 33
Slide 33 text
【学び】 フレームワークと”想定外”の付き合い方 33 ● ドキュメントにないカスタムは ソースコードから読み解くしかない ● フレームワークは内部で使っている技術(Laravel/Symfony) の標準機能を上書き・拡張することで、独自処理を している → 多層構造を理解する必要がある
Slide 34
Slide 34 text
【まとめ】拡張のポイントはDIコンテナの活用 34 ● DIコンテナは、フレームワーク側が用意してくれている 重要な拡張ポイント ● フレームワーク選定時は、DIコンテナで拡張できるかを 確認すると◎ ● 大きく複雑なアプリケーションを破綻することなく、 どのような要望でもある程度叶えられる
Slide 35
Slide 35 text
こちらの本にも対処法が載ってます!!! 35 API Platformを活用したPHPによる本格的なWeb API開発 / 金本 貴志 たつきちさん 今回の内容は 112〜114ページ に載っています ※本人に許諾いただきました