Symfony:如何在实体 __toString 中使用翻译组件?
Symfony: How to use translation component in entity __toString?
是的,我知道之前有人问过这个问题,但我对此有一个很好的用例。有兴趣学习面向视图的补充方法
用例:
我有一个实体,比如 Venue (id, name, capacity)
,我在 EasyAdmin 中将其用作集合。为了呈现选择,我要求此实体具有字符串表示形式。
我希望显示屏显示 %name% (%capacity% places)
。
如您所料,我需要翻译单词“places”。
我想做
- 直接在实体的
__toString()
方法中
- 在表单视图中通过正确呈现
__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 }
我为那个问题实施了一个或多或少复杂的解决方案,请参阅我对这个相关问题的回答:
是的,我知道之前有人问过这个问题,但我对此有一个很好的用例。有兴趣学习面向视图的补充方法
用例:
我有一个实体,比如 Venue (id, name, capacity)
,我在 EasyAdmin 中将其用作集合。为了呈现选择,我要求此实体具有字符串表示形式。
我希望显示屏显示 %name% (%capacity% places)
。
如您所料,我需要翻译单词“places”。
我想做
- 直接在实体的
__toString()
方法中 - 在表单视图中通过正确呈现
__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 }
我为那个问题实施了一个或多或少复杂的解决方案,请参阅我对这个相关问题的回答: