Lumen のjsonレスポンスを拡張する
Laravelではレスポンスマクロというものがある。
いろいろなルートやコントローラで、再利用するためのカスタムレスポンスを定義したい場合はResponseファサードのmacroメソッドが使用できます。
しかしLumenで試すとエラーが出る。そんなものなどないらしい。
Uncaught BadMethodCallException: Method error does not exist. in /var/www/html/src/vendor/illuminate/support/Traits/Macroable.php:74
この記事にかいてある通りResponseファサードがLaravelとは違うみたいですね。
Responseファサードがありません。
Responseファサードのクラス自体はあるのですが、getFacadeAccessor()が返すResponseFactoryContractクラスがDIコンテナに登録されていないので使えません。
けどなんとか拡張したいので下記のようにresponseヘルパーのjsonメソッドを追ってみる。
/vendor/laravel/lumen-framework/src/Http/ResponseFactory.php
→ /vendor/illuminate/http/JsonResponse.php
お、何かMacroableトレイトを使てるっぽい。JsonResponseに追加すればよさそう。
class JsonResponse extends BaseJsonResponse
{
use ResponseTrait, Macroable {
Macroable::__call as macroCall;
}
試す
サービスプロバイダを作成
public function boot()
{
JsonResponse::macro('success', function ($data) {
$rows = [
'message' => 'success',
'option_params' => '',
'data' => $data,
];
return JsonResponse::create($rows);
});
}
public function register()
{
サービスプロバイダーを登録。
$app->register(App\Providers\ResponseMacroServiceProvider::class);
あとはルーティングやコントローラーを追加する。
/**
* ブログ一覧取得
* @return JsonResponse
*/
public function getBlogList(): JsonResponse
{
$data = [
'id' => 1,
'title' => '楽しいゆるふわPHPer'
];
return JsonResponse::success($data);
}
curlで確認。
curl -s "http://localhost:8080/api/blog" | jq
{
"message": "success",
"option_params": "",
"data": {
"id": 1,
"title": "楽しいゆるふわPHPer"
}
}
まとめ
Lumenにはレスポンスマクロはない。しかし、再利用するためのカスタムレスポンスを定義したい場合はJsonResponseクラスのmacroメソッドが使用できるよって話。(MacroトレイトをuseしてるならResponseクラスとかでもできる)
クライアントによってはjsonを共通ヘッダーパターンに変更する場合も使ってます。
Author And Source
この問題について(Lumen のjsonレスポンスを拡張する), 我々は、より多くの情報をここで見つけました https://qiita.com/shuntakeuch1/items/e39615d4211dde11c079著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .