class AutowireRequiredPropertiesPass
Looks for definitions with autowiring enabled and registers their corresponding "#[Required]" properties.
@author Sebastien Morel (Plopix) <morel.seb@gmail.com> @author Nicolas Grekas <p@tchwork.com>
Hierarchy
- class \Symfony\Component\DependencyInjection\Compiler\AbstractRecursivePass implements \Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface
- class \Symfony\Component\DependencyInjection\Compiler\AutowireRequiredPropertiesPass extends \Symfony\Component\DependencyInjection\Compiler\AbstractRecursivePass
Expanded class hierarchy of AutowireRequiredPropertiesPass
File
-
vendor/
symfony/ dependency-injection/ Compiler/ AutowireRequiredPropertiesPass.php, line 25
Namespace
Symfony\Component\DependencyInjection\CompilerView source
class AutowireRequiredPropertiesPass extends AbstractRecursivePass {
protected bool $skipScalars = true;
protected function processValue(mixed $value, bool $isRoot = false) : mixed {
$value = parent::processValue($value, $isRoot);
if (!$value instanceof Definition || !$value->isAutowired() || $value->isAbstract() || !$value->getClass()) {
return $value;
}
if (!($reflectionClass = $this->container
->getReflectionClass($value->getClass(), false))) {
return $value;
}
$properties = $value->getProperties();
foreach ($reflectionClass->getProperties() as $reflectionProperty) {
if (!($type = $reflectionProperty->getType()) instanceof \ReflectionNamedType) {
continue;
}
if (!$reflectionProperty->getAttributes(Required::class)) {
continue;
}
if (\array_key_exists($name = $reflectionProperty->getName(), $properties)) {
continue;
}
$type = $type->getName();
$value->setProperty($name, new TypedReference($type, $type, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, $name));
}
return $value;
}
}