SymfonyでAPI Platform使ってみたが、うまくいかなかった話

こんにちは。

本業の方が結構退屈なので、最近はプラベートで開発をしています。

 

とある案件があってAPIサーバーを作ることになり、前職で利用していたSymfonyで作ろうかなーと作業していました。

 

swagger UI的なものでAPI仕様も表現したくて、公式が推奨しているAPI Platformを触ってみました。

symfony.com

 

これすごいですね。

ソースコード上にendpointやrequest parameter, reposnseを定義して、それをそのままAPI PlatformのUIで表現できる。

f:id:kenshlro:20220416232458p:plain

 

I/Oの定義が可視化されているだけでなく、実行もできちゃいます。

f:id:kenshlro:20220416232522p:plain

[Try it out]を押すと実行状態になります。

 

f:id:kenshlro:20220416232602p:plain

 

本業の方でtypescriptのフレームワークloopbackを使って全く同じようなこと直近でやっていて、他でもこういうのやりたいなーと思ってたらsymfonyでできちゃいました。

 

このページも/apiにアクセスするだけで見れてしまうので、直感的で良いですね。

 

公式の感じだと、tableに対応するEntityがそのままAPIのEntityとして使われる想定みたいでした。

tableと紐付けないAPIのEntityを作って実現していくのも一応できそうでしたが、あまりドキュメントが充実していないくてベストプラクティスに辿り着けませんでした。

 

この辺とか、かゆいところに手が届かない。

api-platform.com

 

symfonycasts.com

 

1階層?のEntityありきで、input, outputのDTOを作るところまでは行けたんですが、

ネストされたinput(post requestのパラメータが深いjson構造になってるとか)だと受け切れなくて諦めました。

 

今までだとControllerでrequestを受け取って、それをFormTypeにバインドするってことができたと思うんですが..

 

具体的には、LINEのメッセージをwebhookで受け付けるAPIを作りたかったんですが、うまくやる方法を見つけられませんでした。

https://developers.line.biz/ja/reference/messaging-api/#message-event

 

なので、普通にControllerで受けるやり方にすることにしました。

そのうちいいやり方が見つかったら置き換えていくのもそんなに難しくないと思うので、誰かがうまくやってくれる日を待ってます。

 

なんかこれを見るとAPIのリクエストはそのままだとバインドできないのか..?

また色々試してみます。

qiita.com