Symfony2:如何在自定义复合表单类型上使用约束?
这是一个我已经打破头了一段时间的问题。请注意,我还不是Symfony2专家,所以我可能在某个地方犯了一个新手错误。
字段 1:标准 Symfony2 字段类型text
字段 2:具有字段 + 字段的自定义字段类型字段)compound
text
checkbox
我的目标:将约束添加到字段以处理autoValue
autoValue's text input child
约束不起作用的原因可能是因为 需要一个字符串值,并且此表单字段的内部数据是一个数组 。此数组值将转换回具有自定义 的字符串。但是,我怀疑在根据已知约束验证字段之后会发生这种情况。NotBlank
array('input'=>'value', 'checkbox' => true)
DataTransformer
正如您在下面的注释代码中看到的那样,我已经能够对文本输入进行约束,但是只有当硬编码到autoValue的表单类型中时,我才能够获得约束,并且我想根据主字段的约束进行验证。
我的(简化的)控制器和字段示例代码:
.
控制器代码
设置用于测试目的的快速表单。
<?php
//...
// $entityInstance holds an entity that has it's own constraints
// that have been added via annotations
$formBuilder = $this->createFormBuilder( $entityInstance, array(
'attr' => array(
// added to disable html5 validation
'novalidate' => 'novalidate'
)
));
$formBuilder->add('regular_text', 'text', array(
'constraints' => array(
new \Symfony\Component\Validator\Constraints\NotBlank()
)
));
$formBuilder->add('auto_text', 'textWithAutoValue', array(
'constraints' => array(
new \Symfony\Component\Validator\Constraints\NotBlank()
)
));
.
文本与自动值源文件
src/My/Component/Form/Type/TextWithAutoValueType.php
<?php
namespace My\Component\Form\Type;
use My\Component\Form\DataTransformer\TextWithAutoValueTransformer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class TextWithAutoValueType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('value', 'text', array(
// when I uncomment this, the NotBlank constraint works. I just
// want to validate against whatever constraints are added to the
// main form field 'auto_text' instead of hardcoding them here
// 'constraints' => array(
// new \Symfony\Component\Validator\Constraints\NotBlank()
// )
));
$builder->add('checkbox', 'checkbox', array(
));
$builder->addModelTransformer(
new TextWithAutoValueTransformer()
);
}
public function getName()
{
return 'textWithAutoValue';
}
}
src/My/Component/Form/DataTransformer/TextWithAutoValueType.php
<?php
namespace My\Component\Form\DataTransformer;
use Symfony\Component\Form\DataTransformerInterface;
class TextWithAutoValueTransformer
implements DataTransformerInterface
{
/**
* @inheritdoc
*/
public function transform($value)
{
return array(
'value' => (string) $value,
'checkbox' => true
);
}
/**
* @inheritdoc
*/
public function reverseTransform($value)
{
return $value['value'];
}
}
src/My/ComponentBundle/Resources/config/services.yml
parameters:
services:
my_component.form.type.textWithAutoValue:
class: My\Component\Form\Type\TextWithAutoValueType
tags:
- { name: form.type, alias: textWithAutoValue }
src/My/ComponentBundle/Resources/views/Form/fields.html.twig
{% block textWithAutoValue_widget %}
{% spaceless %}
{{ form_widget(form.value) }}
{{ form_widget(form.checkbox) }}
<label for="{{ form.checkbox.vars.id}}">use default value</label>
{% endspaceless %}
{% endblock %}
.
问题
我已经阅读文档和谷歌相当好几个小时了,不知道如何复制,绑定或引用在构建此表单时添加的原始约束。
-> 有人知道如何做到这一点吗?
->奖励积分;如何启用已添加到主窗体绑定实体的约束?(通过实体类上的注释)
附言
对不起,这成了一个很长的问题,我希望我成功地把我的问题说清楚了。如果没有,请向我询问更多详细信息!