Skip to content

Commit

Permalink
Автоконфигурация тэгов вынесена в отдельный метод. Карта соответстви…
Browse files Browse the repository at this point in the history
…й - в отдельном классе.
  • Loading branch information
ProklUng committed Jun 26, 2021
1 parent 13d627e commit 2ec37b3
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 22 deletions.
73 changes: 73 additions & 0 deletions src/Framework/AutoconfigureConfig.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?php

namespace Prokl\ServiceProvider\Framework;

use RuntimeException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ServiceLocator;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
use Symfony\Component\Validator\ConstraintValidatorInterface;
use Symfony\Component\Validator\ObjectInitializerInterface;

/**
* Class AutoconfigureConfig
* @package Prokl\ServiceProvider\Framework
*
* @since 26.06.2021
*/
class AutoconfigureConfig
{
/**
* @var string[] $autoConfigure Автоконфигурация тэгов.
*/
private $autoConfigure = [
'controller.service_arguments' => AbstractController::class,
'controller.argument_value_resolver' => ArgumentValueResolverInterface::class,
'container.service_locator' => ServiceLocator::class,
'kernel.event_subscriber' => EventSubscriberInterface::class,
'validator.constraint_validator' => ConstraintValidatorInterface::class,
'validator.initializer' => ObjectInitializerInterface::class,
];

/**
* AutoconfigureConfig constructor.
*
* @param string[] $autoConfigure Дополнительные конфигураторы для тэгов.
*
* @throws RuntimeException Когда необходимая зависимость не существует.
*/
public function __construct(array $autoConfigure = [])
{
$this->autoConfigure[] = $autoConfigure;

$this->checkDependency();
}

/**
* Карта автоконфигурируемых тэгов.
*
* @return string[]
*/
public function getAutoConfigure(): array
{
return $this->autoConfigure;
}

/**
* Проверка на существование зависимостей.
*
* @return void
* @throws RuntimeException Когда необходимая зависимость не существует.
*/
private function checkDependency() : void
{
foreach ($this->autoConfigure as $class) {
if (!class_exists($class)) {
throw new RuntimeException(
'Need class ' . $class . ' not exist.'
);
}
}
}
}
43 changes: 21 additions & 22 deletions src/ServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
use Exception;
use InvalidArgumentException;
use Prokl\ServiceProvider\Bundles\BundlesLoader;
use Prokl\ServiceProvider\Framework\AutoconfigureConfig;
use Prokl\ServiceProvider\Framework\SymfonyCompilerPassBag;
use Prokl\ServiceProvider\Services\AppKernel;
use Prokl\ServiceProvider\Utils\ErrorScreen;
use Psr\Container\ContainerInterface;
use Psr\Container\ContainerInterface as PsrContainerInterface;
use RuntimeException;
use Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper\ProxyDumper;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Config\ConfigCache;
use Symfony\Component\Config\Loader\DelegatingLoader;
use Symfony\Component\Config\Loader\LoaderInterface;
Expand All @@ -31,16 +31,11 @@
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\DependencyInjection\ServiceLocator;
use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Validator\ConstraintValidatorInterface;
use Symfony\Component\Validator\ObjectInitializerInterface;

/**
* Class ServiceProvider
Expand All @@ -63,6 +58,7 @@
* @since 04.04.2021 Вынес стандартные compile pass Symfony в отдельный класс.
* @since 14.04.2021 Метод boot бандлов вызывается теперь после компиляции контейнера.
* @since 27.04.2021 Баг-фикс: при скомпилированном контейнере не запускался метод boot бандлов.
* @since 26.06.2021 Автоконфигурация тэгов вынесена в отдельный метод.
*
* @psalm-consistent-constructor
*/
Expand Down Expand Up @@ -336,6 +332,7 @@ private function initContainer(string $fileName)
}

// Подключение скомпилированного контейнера.
/** @noinspection PhpIncludeInspection */
require_once $compiledContainerFile;

$classCompiledContainerName = '\\'.$classCompiledContainerName;
Expand Down Expand Up @@ -474,6 +471,7 @@ private function loadContainer(string $fileName)
static::$containerBuilder->addCompilerPass($pass);
}

$this->registerAutoconfig();
$this->standartSymfonyPasses();

// Локальные compile pass.
Expand Down Expand Up @@ -628,7 +626,7 @@ private function getPathCacheDirectory(string $filename) : string
}

/**
* Стандартные Symfony манипуляции над контейнером.
* Compiler passes.
*
* @return void
*
Expand All @@ -638,21 +636,6 @@ private function getPathCacheDirectory(string $filename) : string
*/
private function standartSymfonyPasses(): void
{
/** @var array $autoConfigure Автоконфигурация тэгов. */
$autoConfigure = [
'controller.service_arguments' => AbstractController::class,
'controller.argument_value_resolver' => ArgumentValueResolverInterface::class,
'container.service_locator' => ServiceLocator::class,
'kernel.event_subscriber' => EventSubscriberInterface::class,
'validator.constraint_validator' => ConstraintValidatorInterface::class,
'validator.initializer' => ObjectInitializerInterface::class,
];

foreach ($autoConfigure as $tag => $class) {
static::$containerBuilder->registerForAutoconfiguration($class)
->addTag($tag);
}

// Применяем compiler passes.
foreach ($this->standartCompilerPasses as $pass) {
if (!array_key_exists('pass', $pass) || !class_exists($pass['pass'])) {
Expand All @@ -665,6 +648,22 @@ private function standartSymfonyPasses(): void
}
}

/**
* Регистрация автоконфигурируемых тэгов.
*
* @return void
* @throws RuntimeException Когда необходимая зависимость не существует.
*/
private function registerAutoconfig() : void
{
$autoConfigure = new AutoconfigureConfig();

foreach ($autoConfigure->getAutoConfigure() as $tag => $class) {
static::$containerBuilder->registerForAutoconfiguration($class)
->addTag($tag);
}
}

/**
* Загрузка "автономных" бандлов Symfony.
*
Expand Down

0 comments on commit 2ec37b3

Please sign in to comment.