Laravel: кодирование ответов JSON в UTF-8


Я хочу кодировать ответы JSON моего API в UTF-8, но каждый раз, когда я делаю ответ, я не хочу этого делать:

return response()->json($res,200,['Content-type'=>'application/json;charset=utf-8'],JSON_UNESCAPED_UNICODE);

Поэтому я подумал о создании промежуточного программного обеспечения для всех маршрутов API, функция которого handle(...) будет такой:

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, и я не могу его переопределить.

Как мне поступить?

Спасибо Вам за ваше помощь.

1 2

1 ответ:

Его прямо там в документации, вы хотите использовать после middleware (следующий код из верхней части моей головы, и он должен работать):

<?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);
    }
}

При вышеуказанном подходе мы можем обнаружить два анти-паттерна:

  • создание ответа в middleware (вы должны сделать это в контроллере)
  • используя unescaped JSON response, создатели Laravel сделали default экранированным, так зачем его менять?!

Удаление промежуточного ПО и использование только контроллера

Положить следующий код в 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 wrapper - https://github.com/spatie/laravel-fractal).