Laravel: кодировать ответы JSON в UTF-8 - PullRequest
0 голосов
/ 06 июня 2018

Я хочу закодировать ответы 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 Ответ

0 голосов
/ 06 июня 2018

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

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

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

  • создание ответа в промежуточном программном обеспечении (вы должны сделать это в controller )
  • с использованием неэкранированного ответа 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).

...