Php Symfony JMSSerializer访问器调用服务函数

Php Symfony JMSSerializer访问器调用服务函数,php,rest,symfony,serialization,jmsserializerbundle,Php,Rest,Symfony,Serialization,Jmsserializerbundle,我有一个实体UserProfile,它包含一个字段profileImage,它是一个fileKey 当我的REST控制器被调用并需要呈现一个包含UserProfile对象的板时,我希望它返回一个包含fileKey的完整URL 由于我不能在实体中使用服务等,我想是否可以通过访问器调用服务 如何调用访问器中的服务(例如服务)?或者还有其他可能性吗?要在访问器中使用服务,您需要将服务注入实体,或者使用静态外观调用服务。这是不可取的,因为它将实体与服务紧密耦合 而应考虑属性,例如PrimeIdvILL

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

当我的REST控制器被调用并需要呈现一个包含UserProfile对象的板时,我希望它返回一个包含fileKey的完整URL

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


如何调用访问器中的服务(例如服务)?或者还有其他可能性吗?

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

而应考虑属性,例如PrimeIdvILL,并将服务注入到处理程序中。这样,图像名称转换将转移到它所属的表示层

处理程序可能如下所示:

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中,您可以通过将任何服务标记为以下内容,将其用作处理程序:



最后,您可以选择在中使用该服务。文档建议应该在那里添加链接,但我觉得它缺乏可视性,而且闻起来像魔术

谢谢!当您说“这是不可取的”时,您指的是将服务注入实体的外观或想法?两者都有。在实体中使用路由器来构建URL的想法与最佳实践相去甚远,因为它需要额外的依赖关系,并加强组件之间的链接。如何调用服务并不重要——通过构造函数、setter注入或静态调用。如果在getter中使用它,它会使模型依赖于它。模型不应该做View的工作,我需要的是使用EventSubscriberInterface。profileImage只是一个字符串,因此jms_serializer.handler不合适。再次感谢!
<service id="service_id" class="Service">
    <tag name="jms_serializer.handler" 
         type="FQCN\Of\ProfileImageUrl" 
         direction="serialization" 
         format="json"
         method="imageToUrl" />
</service>