Slim 3 中间件验证
Slim 3 middleware validation
我正在尝试将 justinrainbow 中的 json-schema 验证器实现为 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);
有两种可能的方法可以满足我的需求。我做错了什么?
在中间件中验证它并向控制器发送一些 array/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);
对我来说最好的选择是做类似 here 的事情
但我不明白我应该 return 在容器中,以及如何将 get/post 输入传递给容器
您在第一点的代码似乎没问题,您只是尝试从中间件内部访问路由参数。此时路由尚未解析,因此未从 URL.
解析参数
这是一个已知用例,在 Slim's documentation 中进行了描述。将以下设置添加到您的应用程序配置中以使您的代码正常工作:
$app = new App([
'settings' => [
// Only set this if you need access to route within middleware
'determineRouteBeforeAppMiddleware' => true
]
]);
为了了解中间件的工作原理以及如何操作响应对象,我建议您阅读 User Guide - 它不长并且解释得非常好。
我正在尝试将 justinrainbow 中的 json-schema 验证器实现为 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);
有两种可能的方法可以满足我的需求。我做错了什么?
在中间件中验证它并向控制器发送一些 array/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);
对我来说最好的选择是做类似 here 的事情 但我不明白我应该 return 在容器中,以及如何将 get/post 输入传递给容器
您在第一点的代码似乎没问题,您只是尝试从中间件内部访问路由参数。此时路由尚未解析,因此未从 URL.
解析参数这是一个已知用例,在 Slim's documentation 中进行了描述。将以下设置添加到您的应用程序配置中以使您的代码正常工作:
$app = new App([
'settings' => [
// Only set this if you need access to route within middleware
'determineRouteBeforeAppMiddleware' => true
]
]);
为了了解中间件的工作原理以及如何操作响应对象,我建议您阅读 User Guide - 它不长并且解释得非常好。