gpt4 book ai didi

symfony - 使用 JMSSerializerBundle 在 symfony2 中序列化之前自动翻译

转载 作者:行者123 更新时间:2023-12-02 11:05:04 26 4
gpt4 key购买 nike

在从数据库获取实体(通过 findAll() )之后以及将结果序列化为 json 之前,我需要应用一些逻辑。

我想在某些字段上添加翻译。我知道我可以通过迭代每个实体并在 Controller 中应用我的逻辑来手动完成此操作。但我需要一个更好的方法来做到这一点。

是否有建议使其自动执行?

最佳答案

我遇到了类似的问题,并尝试使用自定义处理程序解决此问题,但没有成功,因此我创建了编译器传递并覆盖 JsonSerializationVisitor,其中字符串值使用 TranslatableJsonSerializationVisitor 类进行序列化:

namespace tkuska\DemoBundle\Serialization;
use JMS\Serializer\JsonSerializationVisitor;
use JMS\Serializer\Context;

class TranslatableJsonSerializationVisitor extends JsonSerializationVisitor
{
/**
* @var \Symfony\Component\Translation\Translator;
*/
private $translator;

public function visitString($data, array $type, Context $context)
{
if (in_array('translatable', $type['params'])) {
return (string) $this->translator->trans($data);
}
return (string) $data;
}

public function setTranslator(\Symfony\Component\Translation\Translator $translator)
{
$this->translator = $translator;
}
}

和编译器:

namespace tkuska\DemoBundle\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;

class TranslatableJsonSerializationCompiler implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$jmsJsonSerializationVisitor = $container->getDefinition('jms_serializer.json_serialization_visitor');
$jmsJsonSerializationVisitor->setClass('tkuska\DemoBundle\Serialization\TranslatableJsonSerializationVisitor');

$jmsJsonSerializationVisitor->addMethodCall('setTranslator', array(new Reference('translator')));
}
}

在实体中,我使用参数“translatable”为类型“string”设置注释

/**
* @VirtualProperty
* @Groups({"details"})
* @Type("string<'translatable'>")
* @return order status
*/
public function getOrderStatus(){
return 'status.ordered';
}

当然“status.ordered”是我的翻译键。

关于symfony - 使用 JMSSerializerBundle 在 symfony2 中序列化之前自动翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20544792/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com