php - Symfony2 : Where to inject translation_domain in Form Component

标签 php symfony

我使用 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()
    )
);

最佳答案

一段时间后回到问题,我找到了原因:动态translation_domain可以在setDefaultOptions中设置,如下所示。

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    // ...

    $resolver->setDefaults(array(
        'constraints'        => $collectionConstraint,
        'translation_domain' => 'customTranslationDomain'
    ));
}

但是,在使用的 twig 模板中,此 translation_domain 用于标签和选项,但此 translation_domain 不提供错误消息。它们总是在默认的 twig 模板中使用相同的固定域“验证器”翻译

/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.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 Component,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13299073/

相关文章:

php - 如何在 Symfony 2 中进行需要验证的功能测试?

php - 在 MYSQL 中显示过去六个月每个类别的总支出

php - 将ZKTECO TX268与Web App集成

php - css 转换在循环时不起作用

symfony - 无法安装奏鸣曲管理包

php - Symfony "Welcome page"似乎不完整

php - 如何为我所有的 symfony Controller 创建基类

php - 我的代码有什么错误?

php - Paypal信用卡支付整合问题

symfony - 如何在Symfony 4中获得有效的类(class)?