在 Symfony 2 中验证没有形式的实体

2022-08-30 11:20:25

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

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


答案 1

说实话,形式与验证没有直接关系。让我解释一下。

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

表单使用验证程序组件在数据映射到实体后对其进行验证。这意味着实体的验证与窗体组件完全分离。因此,当表单被验证时,这实际上意味着表单组件验证您的实体,而不是表单数据。得到验证的是实体,而不是表单。

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

话虽如此,这也意味着实体的验证可以非常容易地在表单组件之外完成。您可以将 constaint 定义为注释或在外部文件(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!');
    }
}

如您所见,这里不涉及表单,仅涉及对象和验证器服务。此外,Symfony2的验证组件是完全独立的。这意味着您可以在没有整个框架的情况下使用它。话虽如此,当单独使用时,您会与其他东西很好地集成。

这样,REST 服务将接收参数,从中创建实体,并使用验证程序服务来验证其完整性。使用表单不是验证实体的强制性要求。


答案 2

推荐