From ce0ba186a702d747c0d39e95faffb79be49cf210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mr=C2=B7x?= Date: Mon, 29 Mar 2021 16:17:22 +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 --- Annotation/Inject.php | 1 - Database/Base/BaseActiveRecord.php | 7 +++-- Database/InjectProperty.php | 45 ++++++++++++++++++++++++++++++ System/Abstracts/BaseObject.php | 31 ++++++++++++++++++++ System/Error/LoggerAspect.php | 15 +++++----- 5 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 Database/InjectProperty.php diff --git a/Annotation/Inject.php b/Annotation/Inject.php index d95ec3fb..39f746c2 100644 --- a/Annotation/Inject.php +++ b/Annotation/Inject.php @@ -42,7 +42,6 @@ use Snowflake\Snowflake; $handler[1] = new ReflectionProperty($handler[0], $handler[1]); } - var_dump(get_class($handler[0]) . '::' . $handler[1]); /** @var ReflectionProperty $handler [1] */ if ($handler[1]->isPrivate() || $handler[1]->isProtected()) { $method = 'set' . ucfirst($handler[1]->getName()); diff --git a/Database/Base/BaseActiveRecord.php b/Database/Base/BaseActiveRecord.php index 7b82bb7f..42de165a 100644 --- a/Database/Base/BaseActiveRecord.php +++ b/Database/Base/BaseActiveRecord.php @@ -10,9 +10,11 @@ declare(strict_types=1); namespace Database\Base; +use Annotation\Aspect; use Annotation\Event; use Annotation\Inject; use ArrayAccess; +use Database\InjectProperty; use Database\SqlBuilder; use Database\Traits\HasBase; use HttpServer\Http\Context; @@ -136,6 +138,7 @@ abstract class BaseActiveRecord extends Component implements IOrm, ArrayAccess /** * @throws Exception */ + #[Aspect(InjectProperty::class)] public function init() { if (!Context::hasContext(Relation::class)) { @@ -144,14 +147,13 @@ abstract class BaseActiveRecord extends Component implements IOrm, ArrayAccess } else { $this->_relation = Context::getContext(Relation::class); } - $this->createAnnotation(); } /** * @throws Exception */ - private function createAnnotation() + public function createAnnotation() { $annotation = Snowflake::app()->getAttributes(); $methods = $annotation->getMethods(get_called_class()); @@ -160,6 +162,7 @@ abstract class BaseActiveRecord extends Component implements IOrm, ArrayAccess $attribute->execute([$this, $method]); } } + $annotation->injectProperty($this); } diff --git a/Database/InjectProperty.php b/Database/InjectProperty.php new file mode 100644 index 00000000..ee06e631 --- /dev/null +++ b/Database/InjectProperty.php @@ -0,0 +1,45 @@ +handler, func_get_args()); + + $this->handler[0]->createAnnotation(); + + echo 'inject property.' . PHP_EOL; + + return $data; + } + +} diff --git a/System/Abstracts/BaseObject.php b/System/Abstracts/BaseObject.php index c9694363..f2afe8b0 100644 --- a/System/Abstracts/BaseObject.php +++ b/System/Abstracts/BaseObject.php @@ -13,6 +13,7 @@ use Exception; use JetBrains\PhpStorm\Pure; use ReflectionException; +use Snowflake\Aop; use Snowflake\Error\Logger; use Snowflake\Exception\ComponentException; use Snowflake\Exception\NotFindClassException; @@ -145,6 +146,36 @@ class BaseObject implements Configure } + /** + * @param string $name + * @param array $arguments + * @return mixed + * @throws Exception + */ + public function __call(string $name, array $arguments): mixed + { + if (!Snowflake::app()->has('aop')) { + return call_user_func([$this, $name], $arguments); + } + return \aop([$this, $name], $arguments); + } + + + /** + * @param string $name + * @param array $arguments + * @return mixed + * @throws Exception + */ + public static function __callStatic(string $name, array $arguments): mixed + { + if (!Snowflake::app()->has('aop')) { + return call_user_func([get_called_class(), $name], $arguments); + } + return \aop([get_called_class(), $name], $arguments); + } + + /** * @param mixed $message * @param string $method diff --git a/System/Error/LoggerAspect.php b/System/Error/LoggerAspect.php index 3c5c7359..2f240073 100644 --- a/System/Error/LoggerAspect.php +++ b/System/Error/LoggerAspect.php @@ -4,6 +4,7 @@ namespace Snowflake\Error; +use JetBrains\PhpStorm\Pure; use Snowflake\IAspect; @@ -22,26 +23,24 @@ class LoggerAspect implements IAspect * LoggerAspect constructor. * @param array $handler */ - public function __construct(public array $handler) + #[Pure] public function __construct(public array $handler) { $this->className = get_class($this->handler[0]); $this->methodName = $this->handler[1]; } - /** - * @return mixed|void - */ - public function invoke() + /** + * @return mixed + */ + public function invoke(): mixed { $startTime = microtime(true); $data = call_user_func($this->handler, func_get_args()); $this->print_runtime($startTime); - if ($data === null) { - return; - } + return $data; }