首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过某个值在控制器中动态获取服务的实例

问通过某个值在控制器中动态获取服务的实例
EN

Stack Overflow用户
提问于 2020-05-28 14:33:39
回答 2查看 85关注 0票数 0

我想通过如下所示的值在控制器(symfony 4)中获得一个服务实例:$provider = 'youtube'

这就是我的设置:

代码语言:javascript
复制
Class videoProvider {
//Here I have all common methods for all services
}

Class YoutubeService extends videoProvider {}

Class OtherVideoService extends videoProvider {}

现在的问题是如何做这样的事情。如果是$provider = 'youtube',则使用YouTube服务new YoutubeService (),然后继续。但是如果服务不存在呢?然后呢?

这有可能吗?

EN

回答 2

Stack Overflow用户

发布于 2020-05-28 14:46:23

控制器中的$this->container->has('my-service-name')和$this->container->get('my-service-name')可能就是您想要的。my- service -name是您在服务配置中为服务指定的名称,并确保您的服务是公共的。

示例配置(see doc here)

代码语言:javascript
复制
# this is the service's name
site_video_provider.youtube:
    public: true
    class: App\Provider\YoutubeService
    [...]

然后在控制器或任何容器感知类中:(see doc here)

代码语言:javascript
复制
$service_name = 'site_video_provider.'.$provider;
if($this->container->has($service_name)){
   $service = $this->container->get($service_name);
}
票数 1
EN

Stack Overflow用户

发布于 2020-05-28 16:40:50

你可以这样做

创建一个名为Provider

  • Create接口的文件夹(例如,VideoProviderInterface ),并将其放入到您的接口的文件夹中。将方法VideoProviderInterface

  • 添加到您的接口中并将它们放入文件夹中,并实现接口

  • to your services.yaml添加_instanceof:选项,并向您的接口添加一些标记

< services.yaml >H216中的App\:选项排除您的提供程序文件夹。

有关更多信息,请访问here

services.yaml

代码语言:javascript
复制
_instanceof:
    App\Provider\VideoProviderInterface:
        tags: ['app.provider']

App\Provider\:
    resource: '../../src/Provider/*'

App\Provider\ProviderManager:
    arguments:
        - !tagged_locator { tag: 'app.provider', default_index_method: 'getProviderName' }

App\:
    resource: '../src/*'
    exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php,Provider}'

VideoProviderInterface

代码语言:javascript
复制
<?php

namespace App\Provider;

interface VideoProviderInterface
{
    public function getProviderName(): string
}

ProviderManager

代码语言:javascript
复制
<?php

namespace App\Provider;

use Symfony\Component\DependencyInjection\ServiceLocator;

class ProviderManager
{
    /**
     * @var ServiceLocator
     */
    private $serviceLocator;

    public function __construct(ServiceLocator $serviceLocator)
    {
        $this->serviceLocator = $serviceLocator;
    }

    public function findByName(string $name): ?VideoProviderInterface
    {
        return $this->serviceLocator->has($name) ? $this->serviceLocator->get($name) : null;
    }    
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62058414

复制
相关文章

相似问题

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