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 中的服务。文档建议将链接添加到那里,但根据我的口味,它缺乏可见性,而且闻起来像魔法。
我有一个实体 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 中的服务。文档建议将链接添加到那里,但根据我的口味,它缺乏可见性,而且闻起来像魔法。