Я пытаюсь реализовать валидатор JSON-схемы из justinrainbow в качестве промежуточного ПО в Slim 3.
Я не могу понять, как получить клиентский ввод от запросов 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 возможных способа, как мне это нужно. что я делаю не так?
проверьте его в промежуточном программном обеспечении и отправьте некоторый ответ массива / JSON на контроллер, который я тогда получу, как я понял с $data = $request->getParsedBody();
проверьте его в промежуточном программном обеспечении, но окончательная проверка будет в контроллере следующим образом:
$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);
Лучший вариант для меня это сделать что-то вроде Вот
но я не понимаю, что я должен вернуть в контейнер, и как передать ввод / пост ввода в контейнер
Ваш код в первом пункте выглядит нормально, вы пытаетесь получить доступ к параметру маршрута только из промежуточного программного обеспечения. На данный момент маршрут еще не определен, и поэтому параметры не анализируются из URL.
Это известный случай использования и описан в Документация Слима. Добавьте следующий параметр в конфигурацию вашего приложения, чтобы ваш код работал:
$app = new App([
'settings' => [
// Only set this if you need access to route within middleware
'determineRouteBeforeAppMiddleware' => true
]
]);
Чтобы понять, как работает промежуточное ПО и как управлять объектом ответа, я предлагаю вам прочитать Гид пользователя — это не так долго и объясняет это очень хорошо.
Других решений пока нет …