Symfony JMSSerializer Accessor 调用服务函数

Symfony JMSSerializer Accessor call service function

我有一个实体 UserProfile,它包含一个字段 profileImage,它是一个 fileKey

当我的 REST 控制器被调用并需要呈现一个包含 UserProfile 对象的 Board 时,我希望它 returns 具有 fileKey 的完整 URL。

至于我不能在实体中使用服务等,我想是否可以通过访问器调用服务?

http://jmsyst.com/libs/serializer/master/reference/annotations#accessor

我怎么能打电话给例如访问器中的服务?或者还有其他的可能吗?

要在访问器中使用服务,您需要将服务注入实体,或使用静态外观来调用服务。这是不可取的,因为它将实体与服务紧密耦合。

而是考虑 use a custom type 作为 属性,例如ProfileImageUrl,并将服务注入处理程序。这样图像名称转换转移到它所属的表示层。

处理程序可能如下所示:

class ProfileImageUrlHandler implements SubscribingHandlerInterface
{
    public function __construct(Service $service)
    {
        $this->service = $service;
        parent::__construct();
    }

    public static function getSubscribingMethods()
    {
        return array(
            array(
                'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
                'format' => 'json',
                'type' => 'FQCN\Of\ProfileImageUrl',
                'method' => 'serializeProfileImageUrlToJson',
            ),
        );
    }

    public function serializeProfileImageUrlToJson(JsonSerializationVisitor $visitor, ProfileImageUrl $imageNAme, array $type, Context $context)
    {
        return $this->service->buildUrl($imageName);
    }
}

在 Symfony 中,您可以通过将任何服务标记为 docummented here:

来将其用作处理程序
<service id="service_id" class="Service">
    <tag name="jms_serializer.handler" 
         type="FQCN\Of\ProfileImageUrl" 
         direction="serialization" 
         format="json"
         method="imageToUrl" />
</service>

最后,您可以选择使用 post_rserialize event 中的服务。文档建议将链接添加到那里,但根据我的口味,它缺乏可见性,而且闻起来像魔法。