在Symfony 2中验证没有表单的实体

vin*_*nux 43 php symfony

我正在为Symfony 2创建一个REST API控制器.我开始使用SensioGeneratorBundle创建一个CRUD并修改控制器以充当REST控制器.但是,我没有表格所以我正在考虑删除这部分.

如何在没有表格的情况下验证我的字段?一切都连接到表单,我想要一些自由,包括自定义字段名称.例如,POST x和y字段由Symfony解释为标题和内容.

Mat*_*att 81

说实话,表单与验证没有直接关系.让我解释一下.

表单组件负责映射从客户端接收的数据,无论是GET还是POST数据.因此,它会将字符串映射到代码的对象(如果不绑定到实体,则可以是数组).

表格使用验证器组件在数据映射到实体后验证实体.这意味着实体的验证与表单组件完全分离.因此,在验证表单时,它实际上意味着表单组件验证您的实体而不是表单数据.得到验证的是实体,而不是形式.

该表单仅用于获取字符串表示形式并将其映射到实体层次结构.文档反映了这一点,因为表单验证是symfony 书的不同部分.

话虽这么说,这也意味着实体的验证可以很容易地在表单组件之外完成.您可以将constaints定义为注释或外部文件(yml,php或xml),并使用验证器组件验证实体.这里的代码示例取自本书的验证部分:

use Symfony\Component\HttpFoundation\Response;
use Acme\BlogBundle\Entity\Author;
// ...

public function indexAction()
{
    $author = new Author();
    // ... do something to the $author object

    $validator = $this->get('validator');
    $errors = $validator->validate($author);

    if (count($errors) > 0) {
        return new Response(print_r($errors, true));
    } else {
        return new Response('The author is valid! Yes!');
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,此处不涉及任何形式,只有对象和验证器服务.此外,Symfony2的验证组件是完全独立的.这意味着您可以在没有整个框架的情况下使用它.话虽这么说,当单独使用时,你松散与其他东西的良好集成.

这样,您的REST服务接收参数,从中创建实体并使用验证器服务来验证其完整性.使用表单不是验证实体所必需的.

  • @SoliderCorp,创建一个包含你的两个成员(`email`和`key`)的类(比如说它叫做`RequestCredentials`)并在其中添加验证注释.使用当前请求创建新类,可能类似于`$ credentials = RequestCredentials :: fromRequest(...);`返回`RequestCredentials`的新实例.然后,验证您的新对象是否正常`validator-> validate($ credentials);`. (2认同)
  • @Matt 这个答案绝对是惊人的。不仅提供了一个工作代码,而且很好地阐述了它是如何工作的。刚刚好!谢谢你。 (2认同)