Skip to content

Commit

Permalink
option 'create' and setCreator() are use primary internally
Browse files Browse the repository at this point in the history
  • Loading branch information
dg committed Sep 28, 2021
1 parent 31f7d79 commit da23166
Show file tree
Hide file tree
Showing 28 changed files with 180 additions and 179 deletions.
10 changes: 5 additions & 5 deletions src/DI/Definitions/FactoryDefinition.php
Expand Up @@ -152,13 +152,13 @@ public function complete(Nette\DI\Resolver $resolver): void
if (!$this->parameters) {
$this->completeParameters($resolver);
}
$this->convertArguments($resultDef->getFactory()->arguments);
$this->convertArguments($resultDef->getCreator()->arguments);
foreach ($resultDef->getSetup() as $setup) {
$this->convertArguments($setup->arguments);
}

if ($resultDef->getEntity() instanceof Reference && !$resultDef->getFactory()->arguments) {
$resultDef->setFactory([ // render as $container->createMethod()
if ($resultDef->getEntity() instanceof Reference && !$resultDef->getCreator()->arguments) {
$resultDef->setCreator([ // render as $container->createMethod()
new Reference(Nette\DI\ContainerBuilder::THIS_CONTAINER),
Nette\DI\Container::getMethodName($resultDef->getEntity()->getValue()),
]);
Expand All @@ -176,7 +176,7 @@ private function completeParameters(Nette\DI\Resolver $resolver): void

$ctorParams = [];
if (
($class = $resolver->resolveEntityType($this->resultDefinition->getFactory()))
($class = $resolver->resolveEntityType($this->resultDefinition->getCreator()))
&& ($ctor = (new \ReflectionClass($class))->getConstructor())
) {
foreach ($ctor->getParameters() as $param) {
Expand All @@ -197,7 +197,7 @@ private function completeParameters(Nette\DI\Resolver $resolver): void
$class
));
}
$this->resultDefinition->getFactory()->arguments[$ctorParam->getPosition()] = new Php\Literal('$' . $ctorParam->name);
$this->resultDefinition->getCreator()->arguments[$ctorParam->getPosition()] = new Php\Literal('$' . $ctorParam->name);

} elseif (!$this->resultDefinition->getSetup()) {
$hint = Nette\Utils\Helpers::getSuggestion(array_keys($ctorParams), $param->name);
Expand Down
42 changes: 21 additions & 21 deletions src/DI/Definitions/ServiceDefinition.php
Expand Up @@ -23,15 +23,15 @@
final class ServiceDefinition extends Definition
{
/** @var Statement */
private $factory;
private $creator;

/** @var Statement[] */
private $setup = [];


public function __construct()
{
$this->factory = new Statement(null);
$this->creator = new Statement(null);
}


Expand All @@ -48,16 +48,13 @@ public function setType(?string $type)
*/
public function setFactory($factory, array $args = [])
{
$this->factory = $factory instanceof Statement
? $factory
: new Statement($factory, $args);
return $this;
return $this->setCreator($factory, $args);
}


public function getFactory(): Statement
{
return $this->factory;
return $this->creator;
}


Expand All @@ -67,35 +64,38 @@ public function getFactory(): Statement
*/
public function setCreator($creator, array $args = [])
{
return $this->setFactory($creator, $args);
$this->creator = $creator instanceof Statement
? $creator
: new Statement($creator, $args);
return $this;
}


public function getCreator(): Statement
{
return $this->factory;
return $this->creator;
}


/** @return string|array|Definition|Reference|null */
public function getEntity()
{
return $this->factory->getEntity();
return $this->creator->getEntity();
}


/** @return static */
public function setArguments(array $args = [])
{
$this->factory->arguments = $args;
$this->creator->arguments = $args;
return $this;
}


/** @return static */
public function setArgument($key, $value)
{
$this->factory->arguments[$key] = $value;
$this->creator->arguments[$key] = $value;
return $this;
}

Expand Down Expand Up @@ -142,10 +142,10 @@ public function resolveType(Nette\DI\Resolver $resolver): void
if (!$this->getType()) {
throw new ServiceCreationException('Factory and type are missing in definition of service.');
}
$this->setFactory($this->getType(), $this->factory->arguments ?? []);
$this->setCreator($this->getType(), $this->creator->arguments ?? []);

} elseif (!$this->getType()) {
$type = $resolver->resolveEntityType($this->factory);
$type = $resolver->resolveEntityType($this->creator);
if (!$type) {
throw new ServiceCreationException('Unknown service type, specify it or declare return type of factory.');
}
Expand All @@ -162,13 +162,13 @@ public function resolveType(Nette\DI\Resolver $resolver): void

public function complete(Nette\DI\Resolver $resolver): void
{
$entity = $this->factory->getEntity();
if ($entity instanceof Reference && !$this->factory->arguments && !$this->setup) {
$entity = $this->creator->getEntity();
if ($entity instanceof Reference && !$this->creator->arguments && !$this->setup) {
$ref = $resolver->normalizeReference($entity);
$this->setFactory([new Reference(Nette\DI\ContainerBuilder::THIS_CONTAINER), 'getService'], [$ref->getValue()]);
$this->setCreator([new Reference(Nette\DI\ContainerBuilder::THIS_CONTAINER), 'getService'], [$ref->getValue()]);
}

$this->factory = $resolver->completeStatement($this->factory);
$this->creator = $resolver->completeStatement($this->creator);

foreach ($this->setup as &$setup) {
if (
Expand All @@ -184,8 +184,8 @@ public function complete(Nette\DI\Resolver $resolver): void

public function generateMethod(Nette\PhpGenerator\Method $method, Nette\DI\PhpGenerator $generator): void
{
$entity = $this->factory->getEntity();
$code = $generator->formatStatement($this->factory) . ";\n";
$entity = $this->creator->getEntity();
$code = $generator->formatStatement($this->creator) . ";\n";
if (!$this->setup) {
$method->setBody('return ' . $code);
return;
Expand Down Expand Up @@ -217,7 +217,7 @@ public function generateMethod(Nette\PhpGenerator\Method $method, Nette\DI\PhpGe
public function __clone()
{
parent::__clone();
$this->factory = unserialize(serialize($this->factory));
$this->creator = unserialize(serialize($this->creator));
$this->setup = unserialize(serialize($this->setup));
}
}
Expand Down
25 changes: 13 additions & 12 deletions src/DI/Extensions/DefinitionSchema.php
Expand Up @@ -84,28 +84,29 @@ public function normalize($def, Context $context)
$res += $def->arguments;
} elseif (count($def->arguments) > 1) {
$res['references'] = $def->arguments;
} elseif ($factory = array_shift($def->arguments)) {
$res['factory'] = $factory;
} elseif ($creator = array_shift($def->arguments)) {
$res['create'] = $creator;
}
return $res;

} elseif (!is_array($def) || isset($def[0], $def[1])) {
return ['factory' => $def];
return ['create' => $def];

} elseif (is_array($def)) {
if (isset($def['create']) && !isset($def['factory'])) {
$def['factory'] = $def['create'];
unset($def['create']);
}
// back compatibility
if (isset($def['factory']) && !isset($def['create'])) {
$def['create'] = $def['factory'];
unset($def['factory']);
}

if (
isset($def['class'])
&& !isset($def['type'])
&& !isset($def['factory'])
&& !isset($def['create'])
&& !isset($def['dynamic'])
&& !isset($def['imported'])
) {
$def['factory'] = $def['class'];
$def['create'] = $def['class'];
unset($def['class']);
}

Expand Down Expand Up @@ -197,7 +198,7 @@ private static function getServiceSchema(): Schema
{
return Expect::structure([
'type' => Expect::type('string'),
'factory' => Expect::type('callable|Nette\DI\Definitions\Statement'),
'create' => Expect::type('callable|Nette\DI\Definitions\Statement'),
'arguments' => Expect::array(),
'setup' => Expect::listOf('callable|Nette\DI\Definitions\Statement|array:1'),
'inject' => Expect::bool(),
Expand All @@ -214,7 +215,7 @@ private static function getAccessorSchema(): Schema
return Expect::structure([
'type' => Expect::string(),
'implement' => Expect::string(),
'factory' => Expect::type('callable|Nette\DI\Definitions\Statement'),
'create' => Expect::type('callable|Nette\DI\Definitions\Statement'),
'autowired' => Expect::type('bool|string|array'),
'tags' => Expect::array(),
]);
Expand All @@ -225,7 +226,7 @@ private static function getFactorySchema(): Schema
{
return Expect::structure([
'type' => Expect::string(),
'factory' => Expect::type('callable|Nette\DI\Definitions\Statement'),
'create' => Expect::type('callable|Nette\DI\Definitions\Statement'),
'implement' => Expect::string(),
'arguments' => Expect::array(),
'setup' => Expect::listOf('callable|Nette\DI\Definitions\Statement|array:1'),
Expand Down
2 changes: 1 addition & 1 deletion src/DI/Extensions/InjectExtension.php
Expand Up @@ -46,7 +46,7 @@ public function beforeCompile()

private function updateDefinition(Definitions\ServiceDefinition $def): void
{
$resolvedType = (new DI\Resolver($this->getContainerBuilder()))->resolveEntityType($def->getFactory());
$resolvedType = (new DI\Resolver($this->getContainerBuilder()))->resolveEntityType($def->getCreator());
$class = is_subclass_of($resolvedType, $def->getType())
? $resolvedType
: $def->getType();
Expand Down
16 changes: 8 additions & 8 deletions src/DI/Extensions/ServicesExtension.php
Expand Up @@ -80,8 +80,8 @@ private function loadDefinition(?string $name, \stdClass $config): void
*/
private function updateServiceDefinition(Definitions\ServiceDefinition $definition, \stdClass $config): void
{
if ($config->factory) {
$definition->setFactory(Helpers::filterArguments([$config->factory])[0]);
if ($config->create) {
$definition->setCreator(Helpers::filterArguments([$config->create])[0]);
$definition->setType(null);
}

Expand All @@ -92,7 +92,7 @@ private function updateServiceDefinition(Definitions\ServiceDefinition $definiti
if ($config->arguments) {
$arguments = Helpers::filterArguments($config->arguments);
if (empty($config->reset['arguments']) && !Nette\Utils\Arrays::isList($arguments)) {
$arguments += $definition->getFactory()->arguments;
$arguments += $definition->getCreator()->arguments;
}
$definition->setArguments($arguments);
}
Expand Down Expand Up @@ -121,7 +121,7 @@ private function updateAccessorDefinition(Definitions\AccessorDefinition $defini
$definition->setImplement($config->implement);
}

if ($ref = $config->factory ?? $config->type ?? null) {
if ($ref = $config->create ?? $config->type ?? null) {
$definition->setReference($ref);
}
}
Expand All @@ -136,18 +136,18 @@ private function updateFactoryDefinition(Definitions\FactoryDefinition $definiti
$definition->setAutowired(true);
}

if ($config->factory) {
$resultDef->setFactory(Helpers::filterArguments([$config->factory])[0]);
if ($config->create) {
$resultDef->setCreator(Helpers::filterArguments([$config->create])[0]);
}

if ($config->type) {
$resultDef->setFactory($config->type);
$resultDef->setCreator($config->type);
}

if ($config->arguments) {
$arguments = Helpers::filterArguments($config->arguments);
if (empty($config->reset['arguments']) && !Nette\Utils\Arrays::isList($arguments)) {
$arguments += $resultDef->getFactory()->arguments;
$arguments += $resultDef->getCreator()->arguments;
}
$resultDef->setArguments($arguments);
}
Expand Down

0 comments on commit da23166

Please sign in to comment.