APIのJSON応答をUTF-8にエンコードしたいのですが、応答を行うたびにこれを実行したくありません。
_return response()->json($res,200,['Content-type'=>'application/json;charset=utf-8'],JSON_UNESCAPED_UNICODE);
_
そこで、handle(...)
関数が次のようになるすべてのAPIルートのミドルウェアを作成することを考えました。
_public function handle($request, Closure $next) {
$response = $next($request);
$response->header('Content-type','application/json; charset=utf-8');
return $next($request);
}
_
問題は、それが機能しないことです。私の応答の_Content-type
_ヘッダーはまだ_application/json
_であり、_application/json; charset=utf-8
_ではありません。おそらく、json(...)
関数はすでに_Content-type
_ヘッダーを設定していて、それをオーバーライドできないためです。
どうすればいいですか?
ご協力ありがとうございました。
ドキュメントのすぐそこに、afterミドルウェアを使用したいと思います(次のコードは私の頭の上からのものであり、機能するはずです):
_<?php
namespace App\Http\Middleware;
use Closure;
class AfterMiddleware
{
public function handle($request, Closure $next)
{
/** @var array $data */ // you need to return array from controller
$data = $next($request);
return response()->json($data, 200, ['Content-Type' => 'application/json;charset=UTF-8', 'Charset' => 'utf-8'],
JSON_UNESCAPED_UNICODE);
}
}
_
上記のアプローチでは、2つのアンチパターンを見つけることができます。
次のコードをapp/Http/Controller.phpに配置します
_protected function jsonResponse($data, $code = 200)
{
return response()->json($data, $code,
['Content-Type' => 'application/json;charset=UTF-8', 'Charset' => 'utf-8'], JSON_UNESCAPED_UNICODE);
}
_
ベースコントローラー(app/Http/Controller.php)によって拡張されるコントローラーでは、$this->jsonResponse($data);
を使用できます。
彼らは 雄弁なリソース を使用するか、さらに進んでいる場合は フラクタル が(Laravelで)進む方法です。 spatieラッパーを使用する- https://github.com/spatie/laravel-fractal )。