Chris@14: Chris@14: * Chris@14: * For the full copyright and license information, please view the LICENSE Chris@14: * file that was distributed with this source code. Chris@14: */ Chris@14: Chris@14: namespace Symfony\Component\DependencyInjection\Loader\Configurator; Chris@14: Chris@14: use Symfony\Component\DependencyInjection\Alias; Chris@14: use Symfony\Component\DependencyInjection\ChildDefinition; Chris@14: use Symfony\Component\DependencyInjection\ContainerBuilder; Chris@14: use Symfony\Component\DependencyInjection\Definition; Chris@14: use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; Chris@14: use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; Chris@14: Chris@14: /** Chris@14: * @author Nicolas Grekas Chris@14: * Chris@14: * @method InstanceofConfigurator instanceof($fqcn) Chris@14: */ Chris@14: class ServicesConfigurator extends AbstractConfigurator Chris@14: { Chris@14: const FACTORY = 'services'; Chris@14: Chris@14: private $defaults; Chris@14: private $container; Chris@14: private $loader; Chris@14: private $instanceof; Chris@14: Chris@14: public function __construct(ContainerBuilder $container, PhpFileLoader $loader, array &$instanceof) Chris@14: { Chris@14: $this->defaults = new Definition(); Chris@14: $this->container = $container; Chris@14: $this->loader = $loader; Chris@14: $this->instanceof = &$instanceof; Chris@17: $instanceof = []; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Defines a set of defaults for following service definitions. Chris@14: * Chris@14: * @return DefaultsConfigurator Chris@14: */ Chris@14: final public function defaults() Chris@14: { Chris@14: return new DefaultsConfigurator($this, $this->defaults = new Definition()); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Defines an instanceof-conditional to be applied to following service definitions. Chris@14: * Chris@14: * @param string $fqcn Chris@14: * Chris@14: * @return InstanceofConfigurator Chris@14: */ Chris@14: final protected function setInstanceof($fqcn) Chris@14: { Chris@14: $this->instanceof[$fqcn] = $definition = new ChildDefinition(''); Chris@14: Chris@14: return new InstanceofConfigurator($this, $definition, $fqcn); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Registers a service. Chris@14: * Chris@14: * @param string $id Chris@14: * @param string|null $class Chris@14: * Chris@14: * @return ServiceConfigurator Chris@14: */ Chris@14: final public function set($id, $class = null) Chris@14: { Chris@14: $defaults = $this->defaults; Chris@14: $allowParent = !$defaults->getChanges() && empty($this->instanceof); Chris@14: Chris@14: $definition = new Definition(); Chris@14: $definition->setPublic($defaults->isPublic()); Chris@14: $definition->setAutowired($defaults->isAutowired()); Chris@14: $definition->setAutoconfigured($defaults->isAutoconfigured()); Chris@14: $definition->setBindings($defaults->getBindings()); Chris@17: $definition->setChanges([]); Chris@14: Chris@14: $configurator = new ServiceConfigurator($this->container, $this->instanceof, $allowParent, $this, $definition, $id, $defaults->getTags()); Chris@14: Chris@14: return null !== $class ? $configurator->class($class) : $configurator; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Creates an alias. Chris@14: * Chris@14: * @param string $id Chris@14: * @param string $referencedId Chris@14: * Chris@14: * @return AliasConfigurator Chris@14: */ Chris@14: final public function alias($id, $referencedId) Chris@14: { Chris@14: $ref = static::processValue($referencedId, true); Chris@14: $alias = new Alias((string) $ref, $this->defaults->isPublic()); Chris@14: $this->container->setAlias($id, $alias); Chris@14: Chris@14: return new AliasConfigurator($this, $alias); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Registers a PSR-4 namespace using a glob pattern. Chris@14: * Chris@14: * @param string $namespace Chris@14: * @param string $resource Chris@14: * Chris@14: * @return PrototypeConfigurator Chris@14: */ Chris@14: final public function load($namespace, $resource) Chris@14: { Chris@14: $allowParent = !$this->defaults->getChanges() && empty($this->instanceof); Chris@14: Chris@14: return new PrototypeConfigurator($this, $this->loader, $this->defaults, $namespace, $resource, $allowParent); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Gets an already defined service definition. Chris@14: * Chris@14: * @param string $id Chris@14: * Chris@14: * @return ServiceConfigurator Chris@14: * Chris@14: * @throws ServiceNotFoundException if the service definition does not exist Chris@14: */ Chris@14: final public function get($id) Chris@14: { Chris@14: $allowParent = !$this->defaults->getChanges() && empty($this->instanceof); Chris@14: $definition = $this->container->getDefinition($id); Chris@14: Chris@17: return new ServiceConfigurator($this->container, $definition->getInstanceofConditionals(), $allowParent, $this, $definition, $id, []); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Registers a service. Chris@14: * Chris@14: * @param string $id Chris@14: * @param string|null $class Chris@14: * Chris@14: * @return ServiceConfigurator Chris@14: */ Chris@14: final public function __invoke($id, $class = null) Chris@14: { Chris@14: return $this->set($id, $class); Chris@14: } Chris@14: }