From cc048c560031f52af7ac313a7c701262db5aae8f Mon Sep 17 00:00:00 2001 From: ctexthuang Date: Sat, 6 Sep 2025 23:08:10 +0800 Subject: [PATCH] feat : Decorator Container --- app/Controller/Test/DecoratorController.php | 8 +- .../Test/Decorator/LoggerInterface.php | 16 ++++ .../Container/AbstractLoggerDecorator.php | 80 +++++++++++++++++++ .../Decorator/Container/BasicFileLogger.php | 72 +++++++++++++++++ .../Container/CriticalLoggerDecorator.php | 50 ++++++++++++ .../Decorator/Container/IpLoggerDecorator.php | 52 ++++++++++++ .../Container/TimestampLoggerDecorator.php | 42 ++++++++++ .../Test/Decorator/ContainerService.php | 33 +++++++- composer.json | 16 ++-- composer.lock | 2 +- config/autoload/dependencies.php | 13 +++ config/autoload/logger.php | 18 +++++ request/test.http | 5 ++ 13 files changed, 394 insertions(+), 13 deletions(-) create mode 100644 app/Interface/Test/Decorator/LoggerInterface.php create mode 100644 app/Service/Test/Decorator/Container/AbstractLoggerDecorator.php create mode 100644 app/Service/Test/Decorator/Container/BasicFileLogger.php create mode 100644 app/Service/Test/Decorator/Container/CriticalLoggerDecorator.php create mode 100644 app/Service/Test/Decorator/Container/IpLoggerDecorator.php create mode 100644 app/Service/Test/Decorator/Container/TimestampLoggerDecorator.php diff --git a/app/Controller/Test/DecoratorController.php b/app/Controller/Test/DecoratorController.php index 24a7383..e4945a3 100644 --- a/app/Controller/Test/DecoratorController.php +++ b/app/Controller/Test/DecoratorController.php @@ -20,12 +20,16 @@ class DecoratorController extends AbstractController * @return array */ #[RequestMapping(path: 'basic', methods: 'GET')] - public function basic() + public function basic(): array { return (new BasicService)->handle(); } - public function container() + /** + * @return array + */ + #[RequestMapping(path: 'container', methods: 'GET')] + public function container(): array { return (new ContainerService)->handle(); } diff --git a/app/Interface/Test/Decorator/LoggerInterface.php b/app/Interface/Test/Decorator/LoggerInterface.php new file mode 100644 index 0000000..d9e84fd --- /dev/null +++ b/app/Interface/Test/Decorator/LoggerInterface.php @@ -0,0 +1,16 @@ +logger = $logger; + } + + /** + * 抽象复用 + * @param string $msg + * @return string + */ + abstract protected function decorateMessage(string $msg): string; + + /** + * @param string $msg + * @return void + */ + public function debug(string $msg): void + { + $this->logger->debug($this->decorateMessage($msg)); + } + + /** + * error 级别日志 + * @param string $msg + * @return void + */ + public function error(string $msg): void + { + $this->logger->error($this->decorateMessage($msg)); + } + + /** + * warning 级别日志 + * @param string $msg + * @return void + */ + public function warning(string $msg): void + { + $this->logger->warning($this->decorateMessage($msg)); + } + + + /** + * info 级别日志 + * @param string $msg + * @return void + */ + public function log(string $msg): void + { + $this->logger->log($this->decorateMessage($msg)); + } +} \ No newline at end of file diff --git a/app/Service/Test/Decorator/Container/BasicFileLogger.php b/app/Service/Test/Decorator/Container/BasicFileLogger.php new file mode 100644 index 0000000..12cf0d5 --- /dev/null +++ b/app/Service/Test/Decorator/Container/BasicFileLogger.php @@ -0,0 +1,72 @@ +logger = $loggerFactory->get('app','app'); + } + + /** + * info 级别日志 + * @param string $msg + * @return void + */ + public function log(string $msg): void + { + $this->logger->info($msg); + } + + /** + * debug 级别日志 + * @param string $msg + * @return void + */ + public function debug(string $msg): void + { + $this->logger->debug($msg); + } + + /** + * error 级别日志 + * @param string $msg + * @return void + */ + public function error(string $msg): void + { + $this->logger->error($msg); + } + + /** + * warning 级别日志 + * @param string $msg + * @return void + */ + public function warning(string $msg): void + { + $this->logger->warning($msg); + } +} \ No newline at end of file diff --git a/app/Service/Test/Decorator/Container/CriticalLoggerDecorator.php b/app/Service/Test/Decorator/Container/CriticalLoggerDecorator.php new file mode 100644 index 0000000..ae7649f --- /dev/null +++ b/app/Service/Test/Decorator/Container/CriticalLoggerDecorator.php @@ -0,0 +1,50 @@ +logger->error("[CRITICAL] " . $msg); + } +} \ No newline at end of file diff --git a/app/Service/Test/Decorator/Container/IpLoggerDecorator.php b/app/Service/Test/Decorator/Container/IpLoggerDecorator.php new file mode 100644 index 0000000..56c6be8 --- /dev/null +++ b/app/Service/Test/Decorator/Container/IpLoggerDecorator.php @@ -0,0 +1,52 @@ +request = $request; + } + + /** + * ip装饰 + * @param string $msg + * @return string + */ + protected function decorateMessage(string $msg): string + { + $ip = $this->request->getServerParams()['remote_addr'] ?? 'unknown'; + return "[IP: {$ip}] " . $msg; + } +} \ No newline at end of file diff --git a/app/Service/Test/Decorator/Container/TimestampLoggerDecorator.php b/app/Service/Test/Decorator/Container/TimestampLoggerDecorator.php new file mode 100644 index 0000000..fa26060 --- /dev/null +++ b/app/Service/Test/Decorator/Container/TimestampLoggerDecorator.php @@ -0,0 +1,42 @@ +return->success(); + $this->logger->log('装饰器 [info] 级别日志'); + $this->logger->warning('装饰器 [warning] 级别日志'); + $this->logger->debug('!!装饰器 [debug] 级别日志'); + $this->logger->error('!!!装饰器 [error] 级别日志'); + + return $this->return->success('完成逻辑'); } + + /** + * 封装Log vs 装饰器 + * + * ---------- 封装Log ----------- + * 封装Log因为无需额外调用栈无装饰器的额外内存占用 + * + * ---------- 装饰器 ----------- + * 灵活扩展(比如增加一个 traceId 新增装饰器就好) 可以扩展功能 比如时间戳 比如客户端IP 最重要的错误日志告警-写入后调用报警API-比如企业微信机器人等等 + * + * 优化方案 : 装饰器+异步写入(终极方案)todo 研究方向 + */ } \ No newline at end of file diff --git a/composer.json b/composer.json index c15fe04..c3e3311 100644 --- a/composer.json +++ b/composer.json @@ -13,24 +13,24 @@ "license": "Apache-2.0", "require": { "php": ">=8.1", + "hyperf/amqp": "~3.1.0", + "hyperf/async-queue": "~3.1.0", "hyperf/cache": "~3.1.0", "hyperf/command": "~3.1.0", "hyperf/config": "~3.1.0", + "hyperf/constants": "~3.1.0", + "hyperf/database": "~3.1.0", "hyperf/db-connection": "~3.1.0", + "hyperf/elasticsearch": "~3.1.0", "hyperf/engine": "^2.10", "hyperf/framework": "~3.1.0", "hyperf/guzzle": "~3.1.0", "hyperf/http-server": "~3.1.0", - "hyperf/logger": "~3.1.0", + "hyperf/logger": "^3.1", "hyperf/memory": "~3.1.0", - "hyperf/process": "~3.1.0", - "hyperf/database": "~3.1.0", - "hyperf/redis": "~3.1.0", - "hyperf/constants": "~3.1.0", - "hyperf/async-queue": "~3.1.0", - "hyperf/amqp": "~3.1.0", "hyperf/model-cache": "~3.1.0", - "hyperf/elasticsearch": "~3.1.0", + "hyperf/process": "~3.1.0", + "hyperf/redis": "~3.1.0", "hyperf/tracer": "~3.1.0" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 9a970b7..8d3cc7a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "88f2a4d4a4e81dc7d415bcdf39930654", + "content-hash": "4ac3b7f3d4fc837bc272d5727a863971", "packages": [ { "name": "carbonphp/carbon-doctrine-types", diff --git a/config/autoload/dependencies.php b/config/autoload/dependencies.php index 34f1f9b..39329e6 100644 --- a/config/autoload/dependencies.php +++ b/config/autoload/dependencies.php @@ -11,10 +11,23 @@ declare(strict_types=1); */ use App\Interface\Test\Adapter\CacheInterface; +use App\Interface\Test\Decorator\LoggerInterface; use App\Service\Test\Adapter\Cache\FileCacheAdapter; use App\Service\Test\Adapter\Cache\RedisCacheService; +use App\Service\Test\Decorator\Container\BasicFileLogger; +use App\Service\Test\Decorator\Container\CriticalLoggerDecorator; +use App\Service\Test\Decorator\Container\IpLoggerDecorator; +use App\Service\Test\Decorator\Container\TimestampLoggerDecorator; +use Hyperf\Logger\LoggerFactory; +use function Hyperf\Support\make; return [ CacheInterface::class => RedisCacheService::class, // CacheInterface::class => FileCacheAdapter::class, + LoggerInterface::class => function () { + $logger = make(BasicFileLogger::class); + $logger = make(TimestampLoggerDecorator::class, ['logger' => $logger]); + $logger = make(IpLoggerDecorator::class, ['logger' => $logger]); + return make(CriticalLoggerDecorator::class, ['logger' => $logger]); + }, ]; diff --git a/config/autoload/logger.php b/config/autoload/logger.php index ee4691f..b98cc6f 100644 --- a/config/autoload/logger.php +++ b/config/autoload/logger.php @@ -27,4 +27,22 @@ return [ ], ], ], + 'app' => [ + 'handler' => [ + 'class' => Monolog\Handler\RotatingFileHandler::class, + 'constructor' => [ + 'filename' => BASE_PATH . '/runtime/logs/app/hyperf.log', + 'level' => Monolog\Logger::DEBUG, + ], + ], + 'formatter' => [ + 'class' => Monolog\Formatter\LineFormatter::class, + 'constructor' => [ + 'format' => null, + 'dateFormat' => null, + 'allowInlineLineBreaks' => true, + 'ignoreEmptyContextAndExtra' => true, + ], + ], + ], ]; diff --git a/request/test.http b/request/test.http index de9029f..8148e59 100644 --- a/request/test.http +++ b/request/test.http @@ -15,4 +15,9 @@ Content-Type: application/x-www-form-urlencoded ### Decorator basic test GET {{host}}/decorator/test/basic +Content-Type: application/x-www-form-urlencoded + + +### Decorator container test +GET {{host}}/decorator/test/container Content-Type: application/x-www-form-urlencoded \ No newline at end of file