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