我想通过如下所示的值在控制器(symfony 4)中获得一个服务实例:$provider = 'youtube'
这就是我的设置:
Class videoProvider {
//Here I have all common methods for all services
}
Class YoutubeService extends videoProvider {}
Class OtherVideoService extends videoProvider {}现在的问题是如何做这样的事情。如果是$provider = 'youtube',则使用YouTube服务new YoutubeService (),然后继续。但是如果服务不存在呢?然后呢?
这有可能吗?
发布于 2020-05-28 14:46:23
控制器中的$this->container->has('my-service-name')和$this->container->get('my-service-name')可能就是您想要的。my- service -name是您在服务配置中为服务指定的名称,并确保您的服务是公共的。
示例配置(see doc here)
# this is the service's name
site_video_provider.youtube:
public: true
class: App\Provider\YoutubeService
[...]然后在控制器或任何容器感知类中:(see doc here)
$service_name = 'site_video_provider.'.$provider;
if($this->container->has($service_name)){
$service = $this->container->get($service_name);
}发布于 2020-05-28 16:40:50
你可以这样做
创建一个名为Provider
VideoProviderInterface ),并将其放入到您的接口的文件夹中。将方法VideoProviderInterface
_instanceof:选项,并向您的接口添加一些标记
< services.yaml >H216中的App\:选项排除您的提供程序文件夹。
有关更多信息,请访问here
services.yaml
_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
<?php
namespace App\Provider;
interface VideoProviderInterface
{
public function getProviderName(): string
}ProviderManager
<?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;
}
}https://stackoverflow.com/questions/62058414
复制相似问题