isAutowired() || $value->isAbstract() || !$value->getClass()) { return $value; } if (!$reflectionClass = $this->container->getReflectionClass($value->getClass(), false)) { return $value; } $constructor = $reflectionClass->getConstructor(); if ($constructor === null) { return $value; } $arguments = $value->getArguments(); foreach ($reflectionClass->getConstructor()->getParameters() as $index => $parameter) { $name = '$' . $parameter->getName(); if (isset($arguments[$name]) || isset($arguments[$index])) { continue; } if (!$parameter->hasType()) { continue; } $type = $parameter->getType(); if (!($type instanceof \ReflectionNamedType && $type->getName() === LoggerInterface::class)) { continue; } $channel = $this->getParameterChannelName($parameter) ?? $this->getClassChannelName($reflectionClass) ?? $value->getClass(); $logger = new Definition(Logger::class); $logger->setFactory([new Reference(LogManager::class), 'getLogger']); $logger->setArguments([$channel]); $logger->setShared(false); $value->setArgument($name, $logger); } return $value; } protected function getParameterChannelName(\ReflectionParameter $parameter): ?string { $attributes = $parameter->getAttributes(Channel::class, \ReflectionAttribute::IS_INSTANCEOF); if ($attributes !== []) { return $attributes[0]->newInstance()->name; } return null; } protected function getClassChannelName(\ReflectionClass $class): ?string { $attributes = $class->getAttributes(Channel::class, \ReflectionAttribute::IS_INSTANCEOF); if ($attributes !== []) { return $attributes[0]->newInstance()->name; } if ($class->getParentClass() !== false) { return $this->getClassChannelName($class->getParentClass()); } return null; } }