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ページ に載っています ※本人に許諾いただきました