Symfony:如何在实体 __toString 中使用翻译组件?

Symfony: How to use translation component in entity __toString?

是的,我知道之前有人问过这个问题,但我对此有一个很好的用例。有兴趣学习面向视图的补充方法

用例:

我有一个实体,比如 Venue (id, name, capacity),我在 EasyAdmin 中将其用作集合。为了呈现选择,我要求此实体具有字符串表示形式。

我希望显示屏显示 %name% (%capacity% places)

如您所料,我需要翻译单词“places”。

我想做

  1. 直接在实体的__toString()方法中
  2. 在表单视图中通过正确呈现 __toString() 输出

我也不知道如何实现,但我同意第一种方法违反了 MVC 模式。

请指教

将其显示为 %name% (%capacity% places) 只是表单视图中的 "possible" 表示,因此我会将这种非常具体的表示转移到您的表单类型中。

什么可以属于您的 Venue 实体的 __toString() 方法:

class Venue 
{
    private $name;

    ... setter & getter method

    public function __toString()
    {
        return $this->getName();
    }
}

messages.en.yml:

my_translation: %name% (%capacity% places)

接下来您的 表单类型 使用 choice_label (also worth knowing: choice_translation_domain) :

use Symfony\Component\Translation\TranslatorInterface;

class YourFormType extends AbstractType
{
    private $translator;

    public function __construct(TranslatorInterface $translator)
    {
        $this->translator = $translator;
    }

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(
                'venue',
                EntityType::class,
                array(
                    'choice_label' => function (Venue $venue, $key, $index) {
                        // Translatable choice labels
                        return $this->translator->trans('my_translation', array(
                            '%name%' => $venue->getName(),
                            '%capacity%' => $venue->getCapacity(),
                        ));
                    }
                )
            );
    }

}

& 还在 services.yml:

中将您的表单类型注册为服务
your_form_type:
  class: Your\Bundle\Namespace\Form\YourFormType
  arguments: ["@translator"]
  tags:
    - { name: form.type }

我为那个问题实施了一个或多或少复杂的解决方案,请参阅我对这个相关问题的回答: