65 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			65 lines
		
	
	
		
			2.4 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\DependencyInjection\Loader\Configurator\Traits;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use Symfony\Component\DependencyInjection\ChildDefinition;
							 | 
						||
| 
								 | 
							
								use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
							 | 
						||
| 
								 | 
							
								use Symfony\Component\DependencyInjection\Loader\Configurator\FromCallableConfigurator;
							 | 
						||
| 
								 | 
							
								use Symfony\Component\DependencyInjection\Loader\Configurator\ReferenceConfigurator;
							 | 
						||
| 
								 | 
							
								use Symfony\Component\ExpressionLanguage\Expression;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								trait FromCallableTrait
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    final public function fromCallable(string|array|ReferenceConfigurator|Expression $callable): FromCallableConfigurator
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if ($this->definition instanceof ChildDefinition) {
							 | 
						||
| 
								 | 
							
								            throw new InvalidArgumentException('The configuration key "parent" is unsupported when using "fromCallable()".');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        foreach ([
							 | 
						||
| 
								 | 
							
								            'synthetic' => 'isSynthetic',
							 | 
						||
| 
								 | 
							
								            'factory' => 'getFactory',
							 | 
						||
| 
								 | 
							
								            'file' => 'getFile',
							 | 
						||
| 
								 | 
							
								            'arguments' => 'getArguments',
							 | 
						||
| 
								 | 
							
								            'properties' => 'getProperties',
							 | 
						||
| 
								 | 
							
								            'configurator' => 'getConfigurator',
							 | 
						||
| 
								 | 
							
								            'calls' => 'getMethodCalls',
							 | 
						||
| 
								 | 
							
								        ] as $key => $method) {
							 | 
						||
| 
								 | 
							
								            if ($this->definition->$method()) {
							 | 
						||
| 
								 | 
							
								                throw new InvalidArgumentException(\sprintf('The configuration key "%s" is unsupported when using "fromCallable()".', $key));
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->definition->setFactory(['Closure', 'fromCallable']);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (\is_string($callable) && 1 === substr_count($callable, ':')) {
							 | 
						||
| 
								 | 
							
								            $parts = explode(':', $callable);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            throw new InvalidArgumentException(\sprintf('Invalid callable "%s": the "service:method" notation is not available when using PHP-based DI configuration. Use "[service(\'%s\'), \'%s\']" instead.', $callable, $parts[0], $parts[1]));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if ($callable instanceof Expression) {
							 | 
						||
| 
								 | 
							
								            $callable = '@='.$callable;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->definition->setArguments([static::processValue($callable, true)]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if ('Closure' !== ($this->definition->getClass() ?? 'Closure')) {
							 | 
						||
| 
								 | 
							
								            $this->definition->setLazy(true);
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            $this->definition->setClass('Closure');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return new FromCallableConfigurator($this, $this->definition);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |