Laravel 7 — Как обработать все данные ответа контроллеров API перед вызовом закрытия промежуточного программного обеспечения?

#php #laravel #api #middleware #laravel-7

#php #laravel #API #промежуточное программное обеспечение #laravel-7

Вопрос:

У меня есть API на Laravel 7.0, где все ответы автоматически преобразуются в json по умолчанию из-за промежуточного программного обеспечения api routes.

Проблема в том, что некоторые ответы вызывают ошибку «Искаженные символы UTF-8» в ответе JSON, поэтому мне приходится вручную обрабатывать все данные, прежде чем возвращать их на контроллер, например:

 return FormatString::convertLatin1Utf8($data);
  

Это работает нормально, но теперь я должен возвращать данные таким образом в каждом отдельном методе api.

У меня есть промежуточное программное обеспечение для обработки криптографии при входящих и исходящих запросах, например:

     public function handle($request, Closure $next) {
        //... some processing before request

        $request = $next($request)->original;

        //... some processing after request

        return response()->json($request);
    }
  

Я подумал о форматировании своих данных в промежуточном программном обеспечении после обработки запроса, поэтому мне не пришлось бы вызывать FormatString в каждом методе, например:

     public function handle($request, Closure $next) {
        //... some processing before request

        $request = $next($request)->original;

        //... some processing after request
        $request['data'] = FormatString::convertLatin1Utf8($resquest['data']);

        return response()->json($request);
    }
  

Но при $next($request) вызове он пытается обработать ответ Json для неформатированных данных и выдает ошибку, которую я пытаюсь избежать.

Есть ли какой-либо способ получить данные запроса до того, как Laravel попытается обработать в Json, без необходимости всегда форматировать их при возврате контроллера?

Комментарии:

1. вероятно, вы могли бы использовать какое-то лучшее именование, чем повторное $request использование там

2. Другим вариантом может быть создание ApiController с помощью такого метода, как getResponse($data) , выполняете ли вы преобразование там, и чтобы все ваши контроллеры расширяли этот вызов контроллера return $this->getResponse($data);

3. похоже, вы путаете запрос и ответ в своем описании в своем вопросе

4. Этот метод ApiController будет в основном тем же, что я делаю сейчас, повторяя один и тот же вызов метода в каждом ответе вместо форматирования всех ответов в одном месте.