123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- <?php
- namespace Symfony\Component\Translation\DependencyInjection;
- use Symfony\Component\DependencyInjection\Compiler\AbstractRecursivePass;
- use Symfony\Component\DependencyInjection\ContainerBuilder;
- use Symfony\Component\DependencyInjection\Definition;
- use Symfony\Component\DependencyInjection\Reference;
- use Symfony\Component\DependencyInjection\ServiceLocator;
- class TranslatorPathsPass extends AbstractRecursivePass
- {
- private $translatorServiceId;
- private $debugCommandServiceId;
- private $updateCommandServiceId;
- private $resolverServiceId;
- private $level = 0;
- private $paths = [];
- private $definitions = [];
- private $controllers = [];
- public function __construct(string $translatorServiceId = 'translator', string $debugCommandServiceId = 'console.command.translation_debug', string $updateCommandServiceId = 'console.command.translation_update', string $resolverServiceId = 'argument_resolver.service')
- {
- $this->translatorServiceId = $translatorServiceId;
- $this->debugCommandServiceId = $debugCommandServiceId;
- $this->updateCommandServiceId = $updateCommandServiceId;
- $this->resolverServiceId = $resolverServiceId;
- }
- public function process(ContainerBuilder $container)
- {
- if (!$container->hasDefinition($this->translatorServiceId)) {
- return;
- }
- foreach ($this->findControllerArguments($container) as $controller => $argument) {
- $id = substr($controller, 0, strpos($controller, ':') ?: \strlen($controller));
- if ($container->hasDefinition($id)) {
- list($locatorRef) = $argument->getValues();
- $this->controllers[(string) $locatorRef][$container->getDefinition($id)->getClass()] = true;
- }
- }
- try {
- parent::process($container);
- $paths = [];
- foreach ($this->paths as $class => $_) {
- if (($r = $container->getReflectionClass($class)) && !$r->isInterface()) {
- $paths[] = $r->getFileName();
- }
- }
- if ($paths) {
- if ($container->hasDefinition($this->debugCommandServiceId)) {
- $definition = $container->getDefinition($this->debugCommandServiceId);
- $definition->replaceArgument(6, array_merge($definition->getArgument(6), $paths));
- }
- if ($container->hasDefinition($this->updateCommandServiceId)) {
- $definition = $container->getDefinition($this->updateCommandServiceId);
- $definition->replaceArgument(7, array_merge($definition->getArgument(7), $paths));
- }
- }
- } finally {
- $this->level = 0;
- $this->paths = [];
- $this->definitions = [];
- }
- }
- protected function processValue($value, $isRoot = false)
- {
- if ($value instanceof Reference) {
- if ((string) $value === $this->translatorServiceId) {
- for ($i = $this->level - 1; $i >= 0; --$i) {
- $class = $this->definitions[$i]->getClass();
- if (ServiceLocator::class === $class) {
- if (!isset($this->controllers[$this->currentId])) {
- continue;
- }
- foreach ($this->controllers[$this->currentId] as $class => $_) {
- $this->paths[$class] = true;
- }
- } else {
- $this->paths[$class] = true;
- }
- break;
- }
- }
- return $value;
- }
- if ($value instanceof Definition) {
- $this->definitions[$this->level++] = $value;
- $value = parent::processValue($value, $isRoot);
- unset($this->definitions[--$this->level]);
- return $value;
- }
- return parent::processValue($value, $isRoot);
- }
- private function findControllerArguments(ContainerBuilder $container): array
- {
- if ($container->hasDefinition($this->resolverServiceId)) {
- $argument = $container->getDefinition($this->resolverServiceId)->getArgument(0);
- if ($argument instanceof Reference) {
- $argument = $container->getDefinition($argument);
- }
- return $argument->getArgument(0);
- }
- if ($container->hasDefinition('debug.'.$this->resolverServiceId)) {
- $argument = $container->getDefinition('debug.'.$this->resolverServiceId)->getArgument(0);
- if ($argument instanceof Reference) {
- $argument = $container->getDefinition($argument);
- }
- $argument = $argument->getArgument(0);
- if ($argument instanceof Reference) {
- $argument = $container->getDefinition($argument);
- }
- return $argument->getArgument(0);
- }
- return [];
- }
- }
|