Skip to content

Commit 1705a5d

Browse files
committed
ServiceBuilder::setType() & getType() as a replacements for setClass() and getClass()
# Conflicts: # src/DI/ContainerBuilder.php
1 parent 4241f91 commit 1705a5d

40 files changed

+162
-138
lines changed

src/DI/Compiler.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -339,13 +339,13 @@ public static function loadDefinition(ServiceDefinition $definition, $config, st
339339
$config = Helpers::filterArguments($config);
340340

341341
if (array_key_exists('class', $config) || array_key_exists('factory', $config)) {
342-
$definition->setClass(null);
342+
$definition->setType(null);
343343
$definition->setFactory(null);
344344
}
345345

346346
if (array_key_exists('type', $config)) {
347347
Validators::assertField($config, 'type', 'string|null');
348-
$definition->setClass($config['type']);
348+
$definition->setType($config['type']);
349349
if (array_key_exists('class', $config)) {
350350
throw new Nette\InvalidStateException("Unexpected 'class' when 'type' is used.");
351351
}
@@ -356,7 +356,7 @@ public static function loadDefinition(ServiceDefinition $definition, $config, st
356356
if ($config['class'] instanceof Statement) {
357357
trigger_error("Service '$name': option 'class' should be changed to 'factory'.", E_USER_DEPRECATED);
358358
} else {
359-
$definition->setClass($config['class']);
359+
$definition->setType($config['class']);
360360
}
361361
$definition->setFactory($config['class']);
362362
}

src/DI/ContainerBuilder.php

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ public function getByType(string $class, bool $throw = false)
188188
$class = Helpers::normalizeClass($class);
189189

190190
if ($this->currentService !== null
191-
&& is_a($this->definitions[$this->currentService]->getClass(), $class, true)
191+
&& is_a($this->definitions[$this->currentService]->getType(), $class, true)
192192
) {
193193
return $this->currentService;
194194
}
@@ -277,7 +277,7 @@ public function getClassList(): array
277277
public function prepareClassList()
278278
{
279279
unset($this->definitions[self::THIS_CONTAINER]);
280-
$this->addDefinition(self::THIS_CONTAINER)->setClass(Container::class);
280+
$this->addDefinition(self::THIS_CONTAINER)->setType(Container::class);
281281

282282
$this->classList = false;
283283

@@ -288,7 +288,7 @@ public function prepareClassList()
288288
}
289289

290290
if ($def->isDynamic()) {
291-
if (!$def->getClass()) {
291+
if (!$def->getType()) {
292292
throw new ServiceCreationException("Type is missing in definition of service '$name'.");
293293
}
294294
$def->setFactory(null);
@@ -297,10 +297,10 @@ public function prepareClassList()
297297

298298
// complete class-factory pairs
299299
if (!$def->getEntity()) {
300-
if (!$def->getClass()) {
300+
if (!$def->getType()) {
301301
throw new ServiceCreationException("Factory and type are missing in definition of service '$name'.");
302302
}
303-
$def->setFactory($def->getClass(), ($factory = $def->getFactory()) ? $factory->arguments : []);
303+
$def->setFactory($def->getType(), ($factory = $def->getFactory()) ? $factory->arguments : []);
304304
}
305305

306306
// auto-disable autowiring for aliases
@@ -320,7 +320,7 @@ public function prepareClassList()
320320
// build auto-wiring list
321321
$this->classList = $preferred = [];
322322
foreach ($this->definitions as $name => $def) {
323-
if ($class = $def->getImplement() ?: $def->getClass()) {
323+
if ($class = $def->getImplement() ?: $def->getType()) {
324324
$defAutowired = $def->getAutowired();
325325
if (is_array($defAutowired)) {
326326
foreach ($defAutowired as $k => $aclass) {
@@ -377,22 +377,22 @@ private function resolveImplement(ServiceDefinition $def, $name)
377377
$def->setImplementMode($rc->hasMethod('create') ? $def::IMPLEMENT_MODE_CREATE : $def::IMPLEMENT_MODE_GET);
378378
$methodName = Reflection::toString($method) . '()';
379379

380-
if (!$def->getClass() && !$def->getEntity()) {
380+
if (!$def->getType() && !$def->getEntity()) {
381381
$returnType = Helpers::getReturnType($method);
382382
if (!$returnType) {
383383
throw new ServiceCreationException("Method $methodName used in service '$name' has not return type hint or annotation @return.");
384384
} elseif (!class_exists($returnType)) {
385385
throw new ServiceCreationException("Check a type hint or annotation @return of the $methodName method used in service '$name', class '$returnType' cannot be found.");
386386
}
387-
$def->setClass($returnType);
387+
$def->setType($returnType);
388388
}
389389

390390
if ($rc->hasMethod('get')) {
391391
if ($method->getParameters()) {
392392
throw new ServiceCreationException("Method $methodName used in service '$name' must have no arguments.");
393393
}
394394
if (!$def->getEntity()) {
395-
$def->setFactory('@\\' . ltrim($def->getClass(), '\\'));
395+
$def->setFactory('@\\' . ltrim($def->getType(), '\\'));
396396
} elseif (!$this->getServiceName($def->getFactory()->getEntity())) {
397397
throw new ServiceCreationException("Invalid factory in service '$name' definition.");
398398
}
@@ -401,7 +401,7 @@ private function resolveImplement(ServiceDefinition $def, $name)
401401
if (!$def->parameters) {
402402
$ctorParams = [];
403403
if (!$def->getEntity()) {
404-
$def->setFactory($def->getClass(), $def->getFactory() ? $def->getFactory()->arguments : []);
404+
$def->setFactory($def->getType(), $def->getFactory() ? $def->getFactory()->arguments : []);
405405
}
406406
if (($class = $this->resolveEntityClass($def->getFactory(), [$name => 1]))
407407
&& ($ctor = (new ReflectionClass($class))->getConstructor())
@@ -445,12 +445,12 @@ private function resolveServiceClass($name, array $recursive = [])
445445

446446
$def = $this->definitions[$name];
447447
$factoryClass = $def->getFactory() ? $this->resolveEntityClass($def->getFactory()->getEntity(), $recursive) : null; // call always to check entities
448-
if ($class = $def->getClass() ?: $factoryClass) {
448+
if ($class = $def->getType() ?: $factoryClass) {
449449
if (!class_exists($class) && !interface_exists($class)) {
450450
throw new ServiceCreationException("Class or interface '$class' used in service '$name' not found.");
451451
}
452452
$class = Helpers::normalizeClass($class);
453-
$def->setClass($class);
453+
$def->setType($class);
454454
if (count($recursive) === 1) {
455455
$this->addDependency(new ReflectionClass($factoryClass ?: $class));
456456
}
@@ -502,7 +502,7 @@ private function resolveEntityClass($entity, array $recursive = [])
502502
return $service;
503503
}
504504
return $this->definitions[$service]->getImplement()
505-
?: $this->definitions[$service]->getClass()
505+
?: $this->definitions[$service]->getType()
506506
?: $this->resolveServiceClass($service, $recursive);
507507

508508
} elseif (is_string($entity)) { // class
@@ -621,7 +621,7 @@ public function completeStatement(Statement $statement): Statement
621621
}
622622
} elseif ($class = empty($service) || $entity[1] === 'create'
623623
? $this->resolveEntityClass($entity[0])
624-
: $this->definitions[$service]->getClass()
624+
: $this->definitions[$service]->getType()
625625
) {
626626
$arguments = $this->autowireArguments($class, $entity[1], $arguments);
627627
}
@@ -640,7 +640,7 @@ public function completeStatement(Statement $statement): Statement
640640
if (!isset($pair[1])) { // @service
641641
$val = '@' . $name;
642642
} elseif (preg_match('#^[A-Z][A-Z0-9_]*\z#', $pair[1], $m)) { // @service::CONSTANT
643-
$val = self::literal($this->getDefinition($name)->getClass() . '::' . $pair[1]);
643+
$val = self::literal($this->getDefinition($name)->getType() . '::' . $pair[1]);
644644
} else { // @service::property
645645
$val = new Statement(['@' . $name, '$' . $pair[1]]);
646646
}

src/DI/Extensions/DecoratorExtension.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public function addTags($type, array $tags)
6363
private function findByType($type)
6464
{
6565
return array_filter($this->getContainerBuilder()->getDefinitions(), function ($def) use ($type) {
66-
return is_a($def->getClass(), $type, true) || is_a($def->getImplement(), $type, true);
66+
return is_a($def->getType(), $type, true) || is_a($def->getImplement(), $type, true);
6767
});
6868
}
6969
}

src/DI/Extensions/InjectExtension.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ final class InjectExtension extends DI\CompilerExtension
2525
public function beforeCompile()
2626
{
2727
foreach ($this->getContainerBuilder()->getDefinitions() as $def) {
28-
if ($def->getTag(self::TAG_INJECT) && $def->getClass()) {
28+
if ($def->getTag(self::TAG_INJECT) && $def->getType()) {
2929
$this->updateDefinition($def);
3030
}
3131
}
@@ -34,7 +34,7 @@ public function beforeCompile()
3434

3535
private function updateDefinition(DI\ServiceDefinition $def)
3636
{
37-
$class = $def->getClass();
37+
$class = $def->getType();
3838
$setups = $def->getSetup();
3939

4040
foreach (self::getInjectProperties($class) as $property => $type) {
@@ -51,7 +51,7 @@ private function updateDefinition(DI\ServiceDefinition $def)
5151
array_unshift($setups, $inject);
5252
}
5353

54-
foreach (array_reverse(self::getInjectMethods($def->getClass())) as $method) {
54+
foreach (array_reverse(self::getInjectMethods($def->getType())) as $method) {
5555
$inject = new DI\Statement($method);
5656
foreach ($setups as $key => $setup) {
5757
if ($setup->getEntity() === $inject->getEntity()) {

src/DI/PhpGenerator.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public function generate(string $className): array
6666
->setValue([Container::TYPES => $this->builder->getClassList()]);
6767

6868
foreach ($definitions as $name => $def) {
69-
$meta->value[Container::SERVICES][$name] = $def->getClass() ?: null;
69+
$meta->value[Container::SERVICES][$name] = $def->getType() ?: null;
7070
foreach ($def->getTags() as $tag => $value) {
7171
$meta->value[Container::TAGS][$tag][$name] = $value;
7272
}
@@ -80,7 +80,7 @@ public function generate(string $className): array
8080
throw new ServiceCreationException('Name contains invalid characters.');
8181
}
8282
$containerClass->addMethod($methodName)
83-
->setReturnType($def->getImplement() ?: $def->getClass())
83+
->setReturnType($def->getImplement() ?: $def->getType())
8484
->setBody($name === ContainerBuilder::THIS_CONTAINER ? 'return $this;' : $this->generateService($name))
8585
->setParameters($def->getImplement() ? [] : $this->convertParameters($def->parameters));
8686
} catch (\Exception $e) {
@@ -118,7 +118,7 @@ private function generateService(string $name): string
118118
$this->currentService = null;
119119
$code = '$service = ' . $this->formatStatement($factory) . ";\n";
120120

121-
if ($def->getSetup() && ($class = $def->getClass()) && !$serviceRef && $class !== $entity
121+
if ($def->getSetup() && ($class = $def->getType()) && !$serviceRef && $class !== $entity
122122
&& !(is_string($entity) && preg_match('#^[\w\\\\]+\z#', $entity) && is_subclass_of($entity, $class))
123123
) {
124124
$code .= PhpHelpers::formatArgs("if (!\$service instanceof $class) {\n"
@@ -154,7 +154,7 @@ private function generateService(string $name): string
154154
$factoryClass->addMethod($def->getImplementMode())
155155
->setParameters($this->convertParameters($def->parameters))
156156
->setBody(str_replace('$this', '$this->container', $code))
157-
->setReturnType(Reflection::getReturnType($rm) ?: $def->getClass());
157+
->setReturnType(Reflection::getReturnType($rm) ?: $def->getType());
158158

159159
return 'return new class ($this) ' . $factoryClass . ';';
160160
}

src/DI/ServiceDefinition.php

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ final class ServiceDefinition
3131
public $parameters = [];
3232

3333
/** @var string|null class or interface name */
34-
private $class;
34+
private $type;
3535

3636
/** @var Statement|null */
3737
private $factory;
@@ -59,12 +59,14 @@ final class ServiceDefinition
5959

6060

6161
/**
62+
* @param string|null
6263
* @return static
64+
* @deprecated
6365
*/
6466
public function setClass($class)
6567
{
6668
($this->notifier)();
67-
$this->class = $class;
69+
$this->type = $class;
6870
if (func_num_args() > 1) {
6971
trigger_error(__METHOD__ . '() second parameter $args is deprecated, use setFactory()', E_USER_DEPRECATED);
7072
if ($args = func_get_arg(1)) {
@@ -77,10 +79,32 @@ public function setClass($class)
7779

7880
/**
7981
* @return string|null
82+
* @deprecated
8083
*/
8184
public function getClass()
8285
{
83-
return $this->class;
86+
return $this->type;
87+
}
88+
89+
90+
/**
91+
* @param string|null
92+
* @return static
93+
*/
94+
public function setType($type)
95+
{
96+
($this->notifier)();
97+
$this->type = $type;
98+
return $this;
99+
}
100+
101+
102+
/**
103+
* @return string|null
104+
*/
105+
public function getType()
106+
{
107+
return $this->type;
84108
}
85109

86110

@@ -119,7 +143,7 @@ public function getEntity()
119143
public function setArguments(array $args = [])
120144
{
121145
if (!$this->factory) {
122-
$this->factory = new Statement($this->class);
146+
$this->factory = new Statement($this->type);
123147
}
124148
$this->factory->arguments = $args;
125149
return $this;

tests/DI/Compiler.extension.defaultServices.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class FooExtension extends Nette\DI\CompilerExtension
7575
}
7676

7777
if (!$builder->getByType('FooBar')) {
78-
$builder->addDefinition('five')->setClass('FooBar');
78+
$builder->addDefinition('five')->setType('FooBar');
7979
}
8080
}
8181
}

tests/DI/Compiler.extensionOverride.phpt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,31 +75,31 @@ class FooExtension extends Nette\DI\CompilerExtension
7575
->addSetup('__construct', [2]);
7676

7777
$builder->addDefinition('two1')
78-
->setClass('Lorem')
78+
->setType('Lorem')
7979
->setFactory('Factory::createLorem', [1]);
8080
$builder->addDefinition('two2')
81-
->setClass('Lorem')
81+
->setType('Lorem')
8282
->setFactory('Factory::createLorem', [1]);
8383
$builder->addDefinition('two3')
84-
->setClass('Lorem')
84+
->setType('Lorem')
8585
->setFactory('Factory::createLorem', [1]);
8686
$builder->addDefinition('two4')
87-
->setClass('Lorem')
87+
->setType('Lorem')
8888
->setFactory('Factory::createLorem', [1, 2]);
8989
$builder->addDefinition('two5')
90-
->setClass('Lorem')
90+
->setType('Lorem')
9191
->setFactory('Factory::createLorem', [1]);
9292
$builder->addDefinition('two6')
93-
->setClass('Lorem')
93+
->setType('Lorem')
9494
->setFactory('Factory::createLorem', [1, 2]);
9595
$builder->addDefinition('two7')
96-
->setClass('Lorem')
96+
->setType('Lorem')
9797
->setFactory('Factory::createLorem', [1]);
9898
$builder->addDefinition('two8')
99-
->setClass('Lorem')
99+
->setType('Lorem')
100100
->setFactory('Factory::createLorem', [1, 2]);
101101
$builder->addDefinition('two9')
102-
->setClass('Lorem')
102+
->setType('Lorem')
103103
->setFactory('Factory::createLorem', [1, 2]);
104104

105105
$builder->addDefinition('three1')

tests/DI/Container.createInstance.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class Test
3333

3434
$builder = new DI\ContainerBuilder;
3535
$builder->addDefinition('one')
36-
->setClass('stdClass');
36+
->setType('stdClass');
3737

3838

3939
$container = createContainer($builder);

tests/DI/Container.getByType.alias.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ class_alias('Service', 'Alias');
1717

1818
$builder = new DI\ContainerBuilder;
1919
$one = $builder->addDefinition('one')
20-
->setClass('Service');
20+
->setType('Service');
2121
$two = $builder->addDefinition('two')
22-
->setClass('Alias');
22+
->setType('Alias');
2323

2424
$container = createContainer($builder);
2525

0 commit comments

Comments
 (0)