Можно сделать что-то вроде этого
- Создайте папку с именем Provider
- Создайте интерфейс, например,
VideoProviderInterface
, и поместите в папку - В ваш интерфейс добавьте метод
getProviderName(): string
- Создайте своих провайдеров, поместите их в папку и реализуйте интерфейс
- В свой services.yaml добавьте параметр
_instanceof:
и добавьте в свой интерфейс какой-нибудь тег - Исключите папки вашего провайдера из опции
App\:
в services.yaml - Create class,
ProviderManager
и вставьте ваш локатор сервиса
Более подробную информацию вы можете найти здесь
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;
}
}