Чтобы использовать службу в аксессоре, вам нужно будет внедрить службу в сущность или использовать статический фасад для вызова службы. Это не рекомендуется, так как это сильно связывает объект со службой.
Вместо этого подумайте о том, чтобы использовать настраиваемый тип для свойства, например 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 вы можете использовать любую службу в качестве обработчика, пометив ее как здесь :
<service id="service_id" class="Service">
<tag name="jms_serializer.handler"
type="FQCN\Of\ProfileImageUrl"
direction="serialization"
format="json"
method="imageToUrl" />
</service>
И, наконец, у вас есть возможность использовать службу в событии post_rserialize < / а>. В документации предполагается, что ссылки должны быть добавлены туда, но, на мой вкус, это не наглядно и пахнет волшебством.
person
Alex Blex
schedule
12.05.2017