Skip to content

Commit 3efdd43

Browse files
committed
ServiceDefinition: simplified code
1 parent 185ce31 commit 3efdd43

File tree

3 files changed

+20
-21
lines changed

3 files changed

+20
-21
lines changed

src/DI/Definitions/ServiceDefinition.php

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -184,14 +184,15 @@ public function resolveType(Nette\DI\Resolver $resolver): void
184184
if (!$this->getType()) {
185185
throw new ServiceCreationException('Factory and type are missing in definition of service.');
186186
}
187-
$this->setFactory($this->getType(), ($factory = $this->getFactory()) ? $factory->arguments : []);
187+
$this->setFactory($this->getType(), $this->factory->arguments ?? []);
188188

189189
} elseif (!$this->getType()) {
190-
$type = $resolver->resolveEntityType($this->getFactory());
191-
if ($type) {
192-
$this->setType($type);
193-
$resolver->addDependency(new \ReflectionClass($type));
190+
$type = $resolver->resolveEntityType($this->factory);
191+
if (!$type) {
192+
throw new ServiceCreationException('Unknown service type, specify it or declare return type of factory.');
194193
}
194+
$this->setType($type);
195+
$resolver->addDependency(new \ReflectionClass($type));
195196
}
196197

197198
// auto-disable autowiring for aliases
@@ -203,32 +204,30 @@ public function resolveType(Nette\DI\Resolver $resolver): void
203204

204205
public function complete(Nette\DI\Resolver $resolver): void
205206
{
206-
$entity = $this->getFactory()->getEntity();
207-
$serviceRef = $entity instanceof Reference ? $resolver->normalizeReference($entity) : null;
208-
$factory = $serviceRef && !$this->getFactory()->arguments && !$this->getSetup()
209-
? new Statement([new Reference(Nette\DI\ContainerBuilder::THIS_CONTAINER), 'getService'], [$serviceRef->getValue()])
210-
: $this->getFactory();
207+
$entity = $this->factory->getEntity();
208+
if ($entity instanceof Reference && !$this->factory->arguments && !$this->setup) {
209+
$ref = $resolver->normalizeReference($entity);
210+
$this->setFactory([new Reference(Nette\DI\ContainerBuilder::THIS_CONTAINER), 'getService'], [$ref->getValue()]);
211+
}
211212

212-
$this->setFactory($resolver->completeStatement($factory));
213+
$this->factory = $resolver->completeStatement($this->factory);
213214

214-
$setups = $this->getSetup();
215-
foreach ($setups as &$setup) {
215+
foreach ($this->setup as &$setup) {
216216
if (is_string($setup->getEntity()) && strpbrk($setup->getEntity(), ':@?\\') === false) { // auto-prepend @self
217217
$setup = new Statement([new Reference(Reference::SELF), $setup->getEntity()], $setup->arguments);
218218
}
219219
$setup = $resolver->completeStatement($setup, true);
220220
}
221-
$this->setSetup($setups);
222221
}
223222

224223

225224
public function generateMethod(Nette\PhpGenerator\Method $method, Nette\DI\PhpGenerator $generator): void
226225
{
227-
$entity = $this->getFactory()->getEntity();
228-
$code = '$service = ' . $generator->formatStatement($this->getFactory()) . ";\n";
226+
$entity = $this->factory->getEntity();
227+
$code = '$service = ' . $generator->formatStatement($this->factory) . ";\n";
229228

230229
if (
231-
$this->getSetup()
230+
$this->setup
232231
&& ($type = $this->getType())
233232
&& !$entity instanceof Reference && $type !== $entity
234233
&& !(is_string($entity) && preg_match('#^[\w\\\\]+\z#', $entity) && is_subclass_of($entity, $type))
@@ -239,7 +238,7 @@ public function generateMethod(Nette\PhpGenerator\Method $method, Nette\DI\PhpGe
239238
);
240239
}
241240

242-
foreach ($this->getSetup() as $setup) {
241+
foreach ($this->setup as $setup) {
243242
$code .= $generator->formatStatement($setup) . ";\n";
244243
}
245244

tests/DI/ContainerBuilder.factory.error.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ Assert::exception(function () {
110110
$builder = new DI\ContainerBuilder;
111111
$builder->addDefinition('one')->setFactory('Bad7::create');
112112
$builder->complete();
113-
}, Nette\DI\ServiceCreationException::class, "Service 'one': Type of service is unknown.");
113+
}, Nette\DI\ServiceCreationException::class, "Service 'one': Unknown service type, specify it or declare return type of factory.");
114114

115115

116116
class Bad8

tests/DI/ContainerBuilder.factory.resolveBuiltinTypes.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ namespace
136136
$builder->addDefinition('f')
137137
->setFactory('@factory::createObject');
138138
$container = createContainer($builder);
139-
}, Nette\DI\ServiceCreationException::class, "Service 'f': Type of service is unknown.");
139+
}, Nette\DI\ServiceCreationException::class, "Service 'f': Unknown service type, specify it or declare return type of factory.");
140140

141141
Assert::exception(function () {
142142
$builder = new DI\ContainerBuilder;
@@ -145,6 +145,6 @@ namespace
145145
$builder->addDefinition('f')
146146
->setFactory('@factory::createMixed');
147147
$container = createContainer($builder);
148-
}, Nette\DI\ServiceCreationException::class, "Service 'f': Type of service is unknown.");
148+
}, Nette\DI\ServiceCreationException::class, "Service 'f': Unknown service type, specify it or declare return type of factory.");
149149

150150
}

0 commit comments

Comments
 (0)