web-dev-qa-db-ja.com

Laravel:JSON応答をUTF-8でエンコードする

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_ヘッダーを設定していて、それをオーバーライドできないためです。

どうすればいいですか?

ご協力ありがとうございました。

4
JacopoStanchi

ドキュメントのすぐそこに、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つのアンチパターンを見つけることができます。

  • ミドルウェアでの応答の作成(コントローラーで行う必要があります)
  • エスケープされていないJSON応答を使用して、Laravelの作成者はデフォルトでエスケープされたものを作成したので、なぜそれを変更するのですか?!

ミドルウェアを削除し、コントローラーのみを使用する

次のコードを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 )。

11
Kyslik