152 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| 
 | |
| /*
 | |
|  * This file is part of the Symfony package.
 | |
|  *
 | |
|  * (c) Fabien Potencier <fabien@symfony.com>
 | |
|  *
 | |
|  * For the full copyright and license information, please view the LICENSE
 | |
|  * file that was distributed with this source code.
 | |
|  */
 | |
| 
 | |
| 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;
 | |
| 
 | |
| /**
 | |
|  * @author Yonel Ceruto <yonelceruto@gmail.com>
 | |
|  */
 | |
| 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')
 | |
|     {
 | |
|         if (0 < \func_num_args()) {
 | |
|             trigger_deprecation('symfony/translation', '5.3', 'Configuring "%s" is deprecated.', __CLASS__);
 | |
|         }
 | |
| 
 | |
|         $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)) {
 | |
|                 [$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();
 | |
|                     foreach ($r->getTraits() as $trait) {
 | |
|                         $paths[] = $trait->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, bool $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 [];
 | |
|     }
 | |
| }
 |