尊重\验证与 slim4

如何解决尊重\验证与 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?