如何解决尊重\验证与 slim4
我正在尝试按照本教程添加帖子参数验证:https://odan.github.io/2020/10/08/slim4-respect-validation.html
private function validateProperty(array $data): void
{
$validator = new v();
$validator->addRule(v::key('name',v::allOf(
v::notEmpty()->setTemplate('The property name must not be empty'),v::length(3,150)->setTemplate('Invalid length')
))->setTemplate('The key "Name" is required'));
$validator->addRule(v::key('address',v::allOf(
v::notEmpty()->setTemplate('The address must not be empty'),50)->setTemplate('Invalid length')
))->setTemplate('The key "address" is required'));
$validator->addRule(v::key('original_name',v::allOf(
v::notEmpty()->setTemplate('The original_name must not be empty'),255)->setTemplate('Invalid length')
),false));
$validator->assert($data);
}
现在,如果我发送了正确的值,一切正常。 例如,当我发送错误名称时,抛出错误(500):
Type: Respect\Validation\Exceptions\ValidatorException
Code: 0
Message: These rules must pass for `{ "name": "tx","address": "street1","original_name": "Original" }`
File: C:\MAMP\htdocs\api2\vendor\respect\validation\library\Factory.PHP
Line: 235
这里我不知道如何获得无效名称的消息,而不是这个一般的消息错误。
好的,在我在 src/middleware/RespectValidationMiddleware.PHP 上创建一个中间件之后。
<?PHP
namespace App\Middleware;
use Psr\Http\Message\ResponseFactoryInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Respect\Validation\Exceptions\nestedValidationException;
final class RespectValidationMiddleware implements MiddlewareInterface
{
/**
* @var ResponseFactoryInterface
*/
private $responseFactory;
/**
* The constructor.
*
* @param ResponseFactoryInterface $responseFactory The response factory
*/
public function __construct(ResponseFactoryInterface $responseFactory)
{
$this->responseFactory = $responseFactory;
}
/**
* Invoke middleware.
*
* @param ServerRequestInterface $request The request
* @param RequestHandlerInterface $handler The handler
*
* @return ResponseInterface The response
*/
public function process(
ServerRequestInterface $request,RequestHandlerInterface $handler
): ResponseInterface {
try {
return $handler->handle($request);
} catch(nestedValidationException $exception) {
$messages = [];
/** @var ValidationException $message */
foreach($exception->getIterator() as $message) {
$key = $message->getParam('name');
if($key === null) {
continue;
}
$messages[$key] = $message->getMessage();
}
$response = $this->responseFactory->createResponse();
$result = [
'error' => [
'message' => $exception->getMessage(),'details' => $messages,],];
$response->getBody()->write(json_encode($result));
$response->withHeader('Content-Type','application/json');
return $response->withStatus(422);
}
}
}
<?PHP
use Selective\BasePath\BasePathMiddleware;
use Slim\App;
use Slim\Middleware\ErrorMiddleware;
use App\Middleware\RespectValidationMiddleware;
return function (App $app) {
// Parse json,form data and xml
$app->addBodyParsingMiddleware();
// Add the Slim built-in routing middleware
$app->addRoutingMiddleware();
$app->add(BasePathMiddleware::class);
// Catch exceptions and errors
$app->add(ErrorMiddleware::class);
$app->add(RespectValidationMiddleware::class); // <-- here
};
当我尝试发布数据时,RespectValidationMiddleware 行导致 500 错误,没有错误消息。
我读到尊重/验证会抛出一个 nestedValidationException,但在第一次尝试中我得到了一个 ValidatorException。不知道会不会有问题..
解决方法
删除中间件并尝试$validator->check($data);
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。