Проверка промежуточного программного обеспечения Slim 3

Я пытаюсь реализовать валидатор JSON-схемы из justinrainbow в качестве промежуточного ПО в Slim 3.

  1. Я не могу понять, как получить клиентский ввод от запросов GET / POST в промежуточном программном обеспечении.
    попробовал так:

    $mw = function ($request, $response, $next) {
    $data = $request->getParsedBody();
    print_r($data); // prints nothing
    $id = $request->getAttribute('loan_id');
    print_r($id); // prints nothing
    
    // here I need to validate the user input from GET/POST requests with json-schema library and send the result to controller
    $response = $next($request, $response);
    return $response;
    };
    
    $app->get('/loan/{loan_id}', function (Request $request, Response $response) use ($app, $model) {
    $loanId = $request->getAttribute('loan_id'); // here it works
    $data = $model->getLoan($loanId);
    $newResponse = $response->withJson($data, 201);
    
    return $newResponse;
    })->add($mw);
    
  2. Есть 2 возможных способа, как мне это нужно. что я делаю не так?

    1. проверьте его в промежуточном программном обеспечении и отправьте некоторый ответ массива / JSON на контроллер, который я тогда получу, как я понял с $data = $request->getParsedBody();

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

      $app->get('/loan/{loan_id}', function (Request $request, Response $response) use ($app, $model) {
      if($validator->isValid()){
      //
      }
      $loanId = $request->getAttribute('loan_id'); // here it works
      $data = $model->getLoan($loanId);
      $newResponse = $response->withJson($data, 201);
      
      return $newResponse;
      })->add($mw);
      

Лучший вариант для меня это сделать что-то вроде Вот
но я не понимаю, что я должен вернуть в контейнер, и как передать ввод / пост ввода в контейнер

0

Решение

Ваш код в первом пункте выглядит нормально, вы пытаетесь получить доступ к параметру маршрута только из промежуточного программного обеспечения. На данный момент маршрут еще не определен, и поэтому параметры не анализируются из URL.

Это известный случай использования и описан в Документация Слима. Добавьте следующий параметр в конфигурацию вашего приложения, чтобы ваш код работал:

$app = new App([
'settings' => [
// Only set this if you need access to route within middleware
'determineRouteBeforeAppMiddleware' => true
]
]);

Чтобы понять, как работает промежуточное ПО и как управлять объектом ответа, я предлагаю вам прочитать Гид пользователя — это не так долго и объясняет это очень хорошо.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]