首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态延迟负载服务

动态延迟负载服务
EN

Stack Overflow用户
提问于 2018-08-22 04:39:23
回答 1查看 327关注 0票数 1

在观看了Laravell演示之后,我想在我自己的应用程序中创建类似于镜头的功能。

我有以下概念:

  • 实体:标准原则实体
  • 资源:描述资源的类,包括目标实体和可用镜头。
  • 镜头:有一个方法apply(Request $request, QueryBuilder $qb),允许您修改基于RequestQueryBuilder

目标是将所有Lenses定义为服务,然后以某种方式将它们分配给Resource。这就是我想要解决的问题。

尝试1:将Lenses 直接注入资源

ProjectResource.php

代码语言:javascript
复制
<?php

class ProjectResource
{
    protected $lenses = [];

    public function __construct(
        ProjectRepository $repository,
        LensInterface $activeProjectLens,
        LensInterface $starredProjectLens
    ) {
        $this->lenses = [
            $activeProjectLens,
            $starredProjectLens
        ];
    }

    public function getLenses() {
        return $this->lenses;
    }
}

这样做的缺点是每个Lens服务都是实例化的,需要手动定义。

尝试2:将标记的Lenses 注入资源

在我的services.yaml中,标记服务并将它们作为参数分配给资源:

代码语言:javascript
复制
  App\Lens\ActiveProjectLens:
    tags: ['resource.project.lens']

  App\Lens\StarredProjectLens:
    tags: ['resource.project.lens']

  App\Resource\ProjectResource:
    arguments:
      $lenses: !tagged resource.project.lens

ProjectResource.php

代码语言:javascript
复制
<?php

class ProjectResource
{
    protected $lenses = [];

    public function __construct(
        ProjectRepository $repository,
        iterable $lenses
    ) {
        $this->lenses = $lenses;
    }

    public function getLenses() {
        return $this->lenses;
    }
}

这种方法的缺点是每个Lens服务和资源都必须被标记,不能是自动配置的服务。

**尝试3:添加编译器传递**

我试图将process()方法添加到Kernel中,但没有取得太大进展。

我的目标是在Resource中定义一个服务列表,并注入它们。有什么既定的模式吗?

EN

回答 1

Stack Overflow用户

发布于 2018-08-22 12:29:48

您使用标记的方法似乎很好。Symfony提供了一种自动向实现特定接口的类添加标记的方法:基于接口的服务配置

若要使用该功能,您必须执行以下操作:

  1. 如果您还没有一个接口,那么创建一个接口(例如App\Lens\LensInterface)并让您的透镜类实现接口。
  2. services.yaml文件中添加以下配置:
代码语言:javascript
复制
services:
    // ...

    _instanceof:
        App\Lens\LensInterface:
            tags: ['resource.project.lens']

    App\Resource\ProjectResource:
        arguments:
            $lenses: [!tagged resource.project.lens]

    // ...

然后,实现LensInterface的每个类都将被注入到ProjectResource中,而不必显式地配置每个透镜。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51959966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档