我在一个项目中使用了一些Symfony组件。我的问题是如何使表单组件对表单的验证使用AnnotationMapping来查找约束。
设置:
global $loader; //composer - autoload
AnnotationRegistry::registerLoader([$loader, 'loadClass']);
$validator = Validation::createValidatorBuilder()
->enableAnnotationMapping()
->getValidator();
$formFactory = Forms::createFormFactoryBuilder()
[...]
->addExtension(new ValidatorExtension($validator))
->getFormFactory();
实体
/**
* @ORMEntity
* @ORMTable(name="..")
*/
class Conductor extends AbstractEntity {
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue
*/
protected $id;
/**
* @AssertNotBlank()
* @ORMColumn(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((约束起作用。但无论如何,我的表格都通过了验证。如果我使用一个新的验证器并使用它进行验证,它会向我显示正确的错误。但是表单->isValid((函数没有。也许它没有正确配置为使用AnnotationMapping?提前非常感谢您的小费或解决方案!
问题定位
表单句柄Request/submit和验证正在按预期工作!
表单没有任何约束->从注释映射约束没有发生/工作。
我确实发现了一个类似的问题:为什么Symfony表单不使用约束注释验证我的DTO?
我找不到一个解决方案来启用应该在带有ValidatorExtension的FormComponent内部进行的映射。
但我确实找到了一个功能性的变通方法。我的方法是从验证器的readPropertyMetadata函数中获取约束:
use SymfonyComponentValidatorValidation;
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
]
);
}
}
现在,约束被添加到表单中,验证最终按预期工作。