1

我正在做一个使用一些 Symfony 组件的项目。我的问题是如何让表单组件对表单的验证使用 AnnotationMapping 来查找约束。

设置:

global $loader; //composer - autoload
AnnotationRegistry::registerLoader([$loader, 'loadClass']);

$validator = Validation::createValidatorBuilder()
    ->enableAnnotationMapping()
    ->getValidator();

$formFactory = Forms::createFormFactoryBuilder()
    [...]
    ->addExtension(new ValidatorExtension($validator))
    ->getFormFactory();

实体

/**
 * @ORM\Entity
 * @ORM\Table(name="..")
 */
class Conductor extends AbstractEntity {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    protected $id;

    /**
     * @Assert\NotBlank()
     * @ORM\Column(type="string")
     */
    protected $pattern;

[...]

}

构建表单


$builder = $App->getFormFactory()->createBuilder(FormType::class, $entity_data);
foreach ($fields as $field) {
    $builder->add(
        $field,
        null,
        [
            "attr" => array("class" => "..."),
        ]
    );
}
$builder->getForm();

表单提交/验证


if($request->isMethod('POST')) {
            
    $formTable = $this->createFormTable( array() );
    $form = $formTable->buildForm($entity);
    $form->submit($this->dataMapper->formDataFromPost());

    /*
    $entity = $this->dataMapper->mapFromPost();
    $validator = Validation::createValidatorBuilder()
      ->enableAnnotationMapping()
      ->getValidator();
    */


    if($form->isValid()) {
        [...]
    } else {
        [...]
    }
}

我试图使 NotBlank() 约束工作。但是我的表单无论如何都通过了验证。如果我使用新的验证器并使用它进行验证,它将向我显示正确的错误。但是 Form->isValid() 函数没有。也许它没有正确配置为使用 AnnotationMapping?非常感谢您提前提供提示或解决方案!

问题定位

表单处理请求/提交和验证按预期工作!

表格没有任何限制!! -> 从注释映射约束没有发生/工作。

我确实发现了一个类似的问题:为什么 Symfony 表单不使用约束注释验证我的 DTO?

4

1 回答 1

0

我无法找到一种解决方案来启用应该在 FormComponent 中使用 ValidatorExtension 进行的映射。

但我确实找到了一个实用的解决方法。我的方法是从验证器的 readPropertyMetadata 函数中获取约束:


use Symfony\Component\Validator\Validation;



public function buildForm(AbstractEntity $entity) {

    $validator = Validation::createValidatorBuilder()
        ->enableAnnotationMapping()
        ->getValidator();

    $fields = [*ENTITY PRPERTIES*];

    $classMeta = $validator->getMetadataFor($entity);

    foreach ($fields as $field) {
        $metadata = $classMeta->getPropertyMetadata($field);
        if(is_array($metadata) && count($metadata) > 0) {
            $constraints = $classMeta->getPropertyMetadata($field)[0]->constraints;
        } else {
            $constraints = [];
        }
            

        $builder->add(
            $field,
            null,
            [
                "attr" => array("class" => "..."),
                "constraints" => $constraints
            ]
        );
    }
}

现在约束被添加到表单中,验证最终按预期工作。

于 2020-09-23T07:16:22.287 回答