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 ответ:
Его прямо там в документации, вы хотите использовать после 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).