From 808489382d900a535179b58a4150120ac02715c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mr=C2=B7x?= Date: Wed, 24 Mar 2021 18:08:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- System/Di/Container.php | 50 ++++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/System/Di/Container.php b/System/Di/Container.php index c5329038..4900ca2e 100644 --- a/System/Di/Container.php +++ b/System/Di/Container.php @@ -9,11 +9,14 @@ declare(strict_types=1); namespace Snowflake\Di; +use Annotation\Inject; +use Annotation\Target; use Database\Connection; use HttpServer\Http\HttpHeaders; use ReflectionClass; use Snowflake\Abstracts\BaseObject; use ReflectionException; +use Snowflake\Exception\ComponentException; use Snowflake\Exception\NotFindClassException; use Snowflake\Snowflake; @@ -120,9 +123,11 @@ class Container extends BaseObject * @return object * @throws NotFindClassException * @throws ReflectionException + * @throws ComponentException */ private function resolve($class, $constrict, $config): object { + /** @var ReflectionClass $reflect */ [$reflect, $dependencies] = $this->resolveDependencies($class, $constrict); if (empty($reflect)) { throw new NotFindClassException($class); @@ -136,20 +141,45 @@ class Container extends BaseObject } if (empty($config) || !is_array($config)) { - return $reflect->newInstanceArgs($dependencies); - } - - if (!empty($dependencies) && $reflect->implementsInterface('Snowflake\Abstracts\Configure')) { + $object = $reflect->newInstanceArgs($dependencies); + } else if (!empty($dependencies) && $reflect->implementsInterface('Snowflake\Abstracts\Configure')) { $dependencies[count($dependencies) - 1] = $config; - return $reflect->newInstanceArgs($dependencies); + $object = $reflect->newInstanceArgs($dependencies); + } else { + if (!empty($config)) $this->_param[$class] = $config; + + $object = $this->onAfterInit($reflect->newInstanceArgs($dependencies), $config); } - - if (!empty($config)) $this->_param[$class] = $config; - - - return $this->onAfterInit($reflect->newInstanceArgs($dependencies), $config); + return $this->propertyInject($reflect, $object); } + + /** + * @param ReflectionClass $reflect + * @param $object + * @return mixed + * @throws NotFindClassException + * @throws ReflectionException + * @throws ComponentException + */ + private function propertyInject(ReflectionClass $reflect, $object): mixed + { + $inject = $reflect->getProperties( + \ReflectionProperty::IS_PRIVATE | \ReflectionProperty::IS_PROTECTED | + \ReflectionProperty::IS_PUBLIC + ); + foreach ($inject as $reflectionProperty) { + $attributes = $reflectionProperty->getAttributes(Inject::class); + foreach ($attributes as $attribute) { + /** @var Inject $class */ + $class = $attribute->newInstance(); + $class->execute([$object, $reflectionProperty->getName()]); + } + } + return $object; + } + + /** * @param $object * @param $config