我使用Symfony 2的表单组件创建表单。
由于验证错误是在不同的翻译域中翻译的,因此我想在创建表单时将此信息作为选项(translation_domain)注入(inject),但是找不到在哪里设置的正确(成功)点...有任何提示吗?
我使用自定义类型来捆绑我的表单信息。
我的自定义类型类:
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Validator\Constraints\Collection;
use Symfony\Component\Validator\Constraints\NotBlank;
class LoginType extends AbstractType
{
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$collectionConstraint = $collectionConstraint = new Collection(array(
'password' => array(new NotBlank(array('message' => 'custom.error.blank'))),
'username' => array(new NotBlank(array('message' => 'custom.error.blank')))
));
$resolver->setDefaults(array(
'constraints' => $collectionConstraint
));
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('username', 'text', array(
'max_length' => 250,
'trim' => true
));
$builder->add('password', 'password', array(
'max_length' => 250,
'trim' => true
));
}
public function getName()
{
return 'login';
}
}
有关在 Controller 中创建表单的相关代码段:
$loginForm = $this->createForm(new LoginType(), $loginDefaultData);
$loginForm->bind($request);
[...]
return $this->render(
'MyBundle:SubFolder:login.html.twig',
array(
'loginForm' => $loginForm->createView()
)
);
最佳答案
稍后返回问题后,我发现了原因:可以在setDefaultOptions中按如下所示设置动态translation_domain。
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
// ...
$resolver->setDefaults(array(
'constraints' => $collectionConstraint,
'translation_domain' => 'customTranslationDomain'
));
}
但是,在使用的 Twig 模板中,此translation_domain用于标签和选项,但错误消息不与该translation_domain一起提供。它们始终在默认的 Twig 模板中使用相同的固定集域“验证器”进行翻译,
通常将这些消息捆绑在一个域中是有意义的,但在我的情况下却没有,因为根据上下文必须以不同的方式转换相同的约束(及其错误消息),并且每个上下文都组织在一个隔离的域中。
我的解决方案是customize the form rendering as described in the Symfony2 documentation,重新定义form_errors片段,并将动态translation_domain twig变量也用于错误消息输出。
关于php - Symfony2 : Where to inject translation_domain in Form Componen,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13299073/