【问题标题】:Symfony JMSSerializer Accessor call service functionSymfony JMSSerializer Accessor 调用服务函数
【发布时间】:2017-10-11 10:45:30
【问题描述】:

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

当我的 REST 控制器被调用并需要渲染一个包含用户配置文件对象的板时,我希望它返回一个带有 fileKey 的完整 URL。

就我不能在实体中使用服务等而言,我认为是否可以通过访问器调用服务?

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

我怎么能调用例如访问器内的服务?或者还有其他可能吗?

【问题讨论】:

    标签: php rest symfony serialization jmsserializerbundle


    【解决方案1】:

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

    请考虑使用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 中的服务。文档建议应该在此处添加链接,但在我看来,它缺乏可见性,并且闻起来像魔术。

    【讨论】:

    • 谢谢!当您说“不建议这样做”时,您是指 Facade 还是将服务注入实体的想法?
    • 两者。在实体中使用路由器来构建 url 的想法与最佳实践相去甚远,因为它需要额外的依赖关系并收紧组件之间的链接。服务的调用方式无关紧要——通过构造函数、setter 注入或静态调用。如果它完全在 getter 中使用,它会使模型依赖它。模型不应该做 View 的工作。
    • 使用 EventSubscriberInterface 是我所需要的。 profileImage 只是一个字符串,所以 jms_serializer.handler 不合适。再次感谢!
    猜你喜欢
    • 2018-12-04
    • 2019-09-06
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多