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


Validating entities without form in Symfony 2

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

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

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

表单组件负责映射从客户端接收的数据,无论是 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 服务接收参数,从中创建实体,并使用验证程序服务来验证其完整性。使用窗体不是验证实体的强制性要求。