%PDF- %PDF-
Direktori : /www/varak.net/losik.varak.net/vendor/nette/di/src/DI/Definitions/ |
Current File : //www/varak.net/losik.varak.net/vendor/nette/di/src/DI/Definitions/ServiceDefinition.php |
<?php /** * This file is part of the Nette Framework (https://nette.org) * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare(strict_types=1); namespace Nette\DI\Definitions; use Nette; use Nette\DI\ServiceCreationException; /** * Definition of standard service. * * @property string|null $class * @property Statement $factory * @property Statement[] $setup */ final class ServiceDefinition extends Definition { /** @var Statement */ private $creator; /** @var Statement[] */ private $setup = []; public function __construct() { $this->creator = new Statement(null); } /** @return static */ public function setType(?string $type) { return parent::setType($type); } /** * Alias for setCreator() * @param string|array|Definition|Reference|Statement $factory * @return static */ public function setFactory($factory, array $args = []) { return $this->setCreator($factory, $args); } /** * Alias for getCreator() */ public function getFactory(): Statement { return $this->getCreator(); } /** * @param string|array|Definition|Reference|Statement $creator * @return static */ public function setCreator($creator, array $args = []) { $this->creator = $creator instanceof Statement ? $creator : new Statement($creator, $args); return $this; } public function getCreator(): Statement { return $this->creator; } /** @return string|array|Definition|Reference|null */ public function getEntity() { return $this->creator->getEntity(); } /** @return static */ public function setArguments(array $args = []) { $this->creator->arguments = $args; return $this; } /** @return static */ public function setArgument($key, $value) { $this->creator->arguments[$key] = $value; return $this; } /** * @param Statement[] $setup * @return static */ public function setSetup(array $setup) { foreach ($setup as $v) { if (!$v instanceof Statement) { throw new Nette\InvalidArgumentException('Argument must be Nette\DI\Definitions\Statement[].'); } } $this->setup = $setup; return $this; } /** @return Statement[] */ public function getSetup(): array { return $this->setup; } /** * @param string|array|Definition|Reference|Statement $entity * @return static */ public function addSetup($entity, array $args = []) { $this->setup[] = $entity instanceof Statement ? $entity : new Statement($entity, $args); return $this; } public function resolveType(Nette\DI\Resolver $resolver): void { if (!$this->getEntity()) { if (!$this->getType()) { throw new ServiceCreationException('Factory and type are missing in definition of service.'); } $this->setCreator($this->getType(), $this->creator->arguments ?? []); } elseif (!$this->getType()) { $type = $resolver->resolveEntityType($this->creator); if (!$type) { throw new ServiceCreationException('Unknown service type, specify it or declare return type of factory method.'); } $this->setType($type); $resolver->addDependency(new \ReflectionClass($type)); } // auto-disable autowiring for aliases if ($this->getAutowired() === true && $this->getEntity() instanceof Reference) { $this->setAutowired(false); } } public function complete(Nette\DI\Resolver $resolver): void { $entity = $this->creator->getEntity(); if ($entity instanceof Reference && !$this->creator->arguments && !$this->setup) { $ref = $resolver->normalizeReference($entity); $this->setCreator([new Reference(Nette\DI\ContainerBuilder::ThisContainer), 'getService'], [$ref->getValue()]); } $this->creator = $resolver->completeStatement($this->creator); foreach ($this->setup as &$setup) { if ( is_string($setup->getEntity()) && strpbrk($setup->getEntity(), ':@?\\') === false ) { // auto-prepend @self $setup = new Statement([new Reference(Reference::Self), $setup->getEntity()], $setup->arguments); } $setup = $resolver->completeStatement($setup, true); } } public function generateMethod(Nette\PhpGenerator\Method $method, Nette\DI\PhpGenerator $generator): void { $entity = $this->creator->getEntity(); $code = $generator->formatStatement($this->creator) . ";\n"; if (!$this->setup) { $method->setBody('return ' . $code); return; } $code = '$service = ' . $code; foreach ($this->setup as $setup) { $code .= $generator->formatStatement($setup) . ";\n"; } $code .= 'return $service;'; $method->setBody($code); } public function __clone() { parent::__clone(); $this->creator = unserialize(serialize($this->creator)); $this->setup = unserialize(serialize($this->setup)); } } class_exists(Nette\DI\ServiceDefinition::class);