我创建了一个包含一些属性的简单实体类和一个执行某些内容并返回 true 或 false 的公共 getter-Method。
class Item {
public prop1;
public prop2;
public function isGetterConstraint() {
return true // or false based on some calculations
}
}
然后我在validation.yml中定义了该类的约束:
FooMyBundleEntityItem:
properties:
prop1:
- NotBlank: ~
prop2:
- NotBlank: ~
getters:
getterConstraint:
- "True": { message: "zu" }
这就是您在许多示例中看到的,但我还没有发现如何在控制器或 twig 模板中以形式访问此 getter 约束。就我而言,我确实需要在模板中使用它。
如果我这样定义我的表单类型
class ClientType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('prop1', 'text')
->add('prop2', 'text');
}
public function getName()
{
return 'item';
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'FooMyBundleEntityItem',
));
}
}
和我的控制器那样
class ItemController extends Controller {
public function createAction(Request $request) {
$item = new Item();
$form = $this->buildForm($item);
$form->handleRequest($request);
if ($form->isValid()) {
// do some nice things like saving the data
}
return $this->render('FooMyBundle:Item:form.html.twig', array('form' => $form->createView());
}
}
表单不知道 getter 约束,我无法像习惯属性约束那样访问它:
// form.html.thwig
{% if form.prop1.vars.errors %}{% endif %} // works
{% if form.getterConstraint.vars.errors %}{% endif %} // doesnot work
有没有办法将 getter 约束添加到 FormType,或者我必须做什么才能使表单在验证数据时考虑此约束并将结果公开给控制器或模板?
您实际上可以直接在实体中使用 getter 约束
// src/Acme/BlogBundle/Entity/Author.php
// ...
use SymfonyComponentValidatorMappingClassMetadata;
use SymfonyComponentValidatorConstraintsTrue;
class Author
{
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addGetterConstraint('passwordLegal', new True(array(
'message' => 'The password cannot match your first name',
)));
}
public function isPasswordLegal()
{
return $this->firstName != $this->password;
}
}
演示代码取自Symfony Validation
或者,您可以使用注释定义实体中的回调
// src/Acme/BlogBundle/Entity/Author.php
// ...
use SymfonyComponentValidatorConstraints as Assert;
use SymfonyComponentValidatorExecutionContextInterface;
/**
* @AssertCallback(methods={"isPasswordLegal"})
*/
class Author
{
public function isPasswordLegal(ExecutionContextInterface $context)
{
$context->addViolationAt('password', 'wrong password');
}
}
在控制器中,您可以这样做
// src/KnpU/QADayBundle/Controller/EventController.php
use SymfonyComponentValidatorConstraints as Assert;
use SymfonyComponentValidatorExecutionContextInterface;
use KnpUQADayBundleEntityEvent;
// ...
public function newAction(Request $request)
{
$form = $this->createFormBuilder(null, array(
'data_class' => 'KnpUQADayBundleEntityEvent',
'constraints' => array(
new AssertCallback(array(array($this, 'validateEventDates')))
)
))
->add('name', 'text')
->add('startDate', 'datetime')
->add('endDate', 'datetime')
->getForm()
;
// ...
}
public function validateEventDates(Event $event, ExecutionContextInterface $context)
{
$context->addViolationAt('startDate', 'There is already an event during this time!');
}
自定义验证、回调和约束