diff --git a/src/Framework/AutoconfigureConfig.php b/src/Framework/AutoconfigureConfig.php new file mode 100644 index 0000000..de45b94 --- /dev/null +++ b/src/Framework/AutoconfigureConfig.php @@ -0,0 +1,73 @@ + 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.' + ); + } + } + } +} diff --git a/src/ServiceProvider.php b/src/ServiceProvider.php index e443226..be36bae 100644 --- a/src/ServiceProvider.php +++ b/src/ServiceProvider.php @@ -7,6 +7,7 @@ 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; @@ -14,7 +15,6 @@ 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; @@ -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 @@ -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 */ @@ -336,6 +332,7 @@ private function initContainer(string $fileName) } // Подключение скомпилированного контейнера. + /** @noinspection PhpIncludeInspection */ require_once $compiledContainerFile; $classCompiledContainerName = '\\'.$classCompiledContainerName; @@ -474,6 +471,7 @@ private function loadContainer(string $fileName) static::$containerBuilder->addCompilerPass($pass); } + $this->registerAutoconfig(); $this->standartSymfonyPasses(); // Локальные compile pass. @@ -628,7 +626,7 @@ private function getPathCacheDirectory(string $filename) : string } /** - * Стандартные Symfony манипуляции над контейнером. + * Compiler passes. * * @return void * @@ -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'])) { @@ -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. *