【问题标题】:Symfony 3.3 - Validation without formSymfony 3.3 - 无表单验证
【发布时间】:2018-02-06 17:15:31
【问题描述】:

我正在尝试对传入的一些查询字符串参数进行一些验证。我想做 3 件事:

  1. 检查名字是否通过。
  2. 如果通过,验证它是一个字符串。否则,抛出错误。
  3. 如果未通过,请指定一个默认名称。

我想尽可能多地重复使用内置的 Symfony 验证器功能来执行此操作,并且到目前为止有类似下面的代码(但它不起作用)。有人有建议吗?

相关参考资料:

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Validator\Constraints\Collection
use Symfony\Component\Validator\Constraints\Type

代码:

public function testingAction(Request $request)
{
    $parameters = $request->query->all();
   // for this example, assume that $parameters contains 'firstname'=>123

   $collectionConstraint = new Collection(array(
      'firstname' => new Type(array('type'=>'string'))
   );

   $errors = $this->container->get('validator')->validate($parameters, $collectionConstraint);

   return new Response('<html><body><pre>' . print_r($errors, TRUE) . '</pre></body></html>');
}

【问题讨论】:

    标签: php api symfony validation


    【解决方案1】:

    Symfony 验证适用于实体类。您需要使用验证注释为您的数据创建一个实体类。

    // src/Entity/Author.php
    
    // ...
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Author
    {
        /**
         * @Assert\NotBlank()
         */
        public $name;
    }
    

    //然后将此类用于您的数据

    use src/Entity/Auther.php;
    public function testingAction(Request $request)
    {
        $parameters = $request->query->all();
        $auther = new Auther();
        $auther->setName($paramater['name']);
        $errors = $this->container->get('validator')->validate($auther);
    
       return new Response('<html><body><pre>' . print_r($errors, TRUE) . '</pre></body></html>');
    }
    

    请点击 symfony 链接https://symfony.com/doc/current/validation.html

    【讨论】:

    • 感谢 Vikash 的示例。我认为这是一种很好的做事方式。但是,在我们的情况下,并非每个作为查询字符串传递到 REST API 的参数都必须映射到数据库中的字段。在某些情况下,它可能(如名字、姓氏等)。但是,在其他情况下,我们允许用户传递类似 ?limit=50 的查询字符串(表示他们只想查看 50 条记录)。我们的 Entity 类中没有限制字段,但我们有名字、姓氏等的限制字段。那么,您是否知道将这一要求也纳入您的解决方案的方法?
    • 另外,在上面,您正在创建一个实体类的实例,然后设置名称参数,然后在实体上调用验证函数。我们 90% 的 REST API 操作将是只读操作,客户端只是请求数据(然后,它们可以通过添加查询字符串参数进行过滤)。在这种情况下,在 Entity 类上设置属性似乎很奇怪,而事实上,我们不会将该数据写入/持久化回数据库。虽然我可以看到您这样做的原因是能够验证。考虑到要求,这仍然是最佳解决方案吗?
    猜你喜欢
    • 2017-11-12
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多