rxthunder / skeleton
基于事件驱动的CLI微框架,具有响应式编程特性,用于分叉和玩耍,适合生产环境
Requires
- rxthunder/core: ^1.0
README
关于Thunder CLI μ框架
此仓库是Thunder CLI微框架的脚手架。
您可以使用它并根据您的需求修改结构。
哲学
有时在编写事件编程时,您可能只需要一个非常简单的基于事件循环的守护进程。一个包含少量依赖项的简单仓库,您不想被迫使用库或其他东西。
您所需要的只是一个对系统发生的事件的反应,无论是外部还是内部(例如pub/sub或saga)。
然而,此项目是在一个默认使用响应式编程、RabbitMQ消费者、路由器、EventStore投影和事件、MySQL、Redis连接器等项目的仓库中诞生的。
简单但强大。
内置功能
控制台组件
整个概念基于控制台。Thunder使用Silly微框架,而不是重新发明轮子。框架提供了一个名为Console
的类,允许扩展它的类自动加载和使用。
依赖注入
使用依赖注入模式,简化了代码解耦和质量测试编写。选择Symfony DI组件,因其许多功能而提高了开发者的体验。
配置组件
此组件允许您使用XML、YAML & PHP文件。您可以直接通过DI在构造函数中使用它们。
路由器
此组件在项目中居中,命令总线(Command Bus)和事件调度器(Event Dispatcher)模式不适用于非确认(nack
)消息。
它相当简单,可以将一个Route
与MVC架构中的Controller
关联起来。核心提供了一个名为Route
的基本类,允许自动加载扩展它的所有类到路由器。
每个路由都必须定义一个名为PATH
的常量。它用于确定必须调用您应用程序的哪个Route
。
由于我们处于事件驱动框架中,所有Route
都必须返回一个Observable
。您将在应用程序中使用不同的插件,它们将通过Observers
订阅您的Observable
,以确定在事件链的末尾要执行的操作。
安装
composer create-project rxthunder/skeleton name-of-your-project
用法
控制台
首先,有一个控制台。CLI代表命令行界面。
要启动项目,您需要执行一个位于 vendors 中的 PHP 文件,即 vendor/bin/thunder
。
所有可用的命令都会被提示。
创建新的Route
在/src
中创建一个扩展Th3Mouk\Thunder\Router\Route
的类,它将自动添加到路由器。
如果您不想使用src
文件夹,可以修改config/services.php
和composer.json
的自动加载。
现在,您的Route
将通过PATH常量与相应的DataModel
一起调用。
额外:处理器概念
我个人使用 src/route
和 src/handler
结构。这里的 handler
一词来自命令总线模式。
在这里,handler 是一个小型可调用的单元,可以在多个上下文中重用,例如事件序列或再次在这里使用路由。这种结构的主要优势在于你可以解耦代码并正确地测试它,因为是的,这个 handler 将会自动注入到容器中,你可以在其构造函数中使用依赖注入 🎉。
一个例子可以是
// src/Handler/PromptHello.php namespace App\Handler; use Rx\Observable; use RxThunder\Core\Model\DataModel; class PromptHello { public function __invoke(DataModel $data_model) { return Observable::of($data_model) ->do(function() { echo "hello there". PHP_EOL; }); } }
最后,你可以在你的路由中使用这个单元
// src/Route/Test.php namespace App\Route; use App\Handler\PromptHello; use Rx\Observable; use RxThunder\Core\Model\DataModel; use RxThunder\Core\Router\Route; class Test extends Route { public const PATH = '/test'; private $prompt; public function __construct( PromptHello $prompt ) { $this->prompt = $prompt; } public function __invoke(DataModel $data_model): Observable { return Observable::of($data_model) ->do(function () { echo "i'm in /test".PHP_EOL; }) ->flatMap($this->prompt) ->do(function () { echo "passed in /test".PHP_EOL; }); } }
开始消费
如果你使用 RabbitMQ 插件,你可以使用 php console rabbit:listen:broker test
来开始消费一个队列(test
是要消费的队列名称)
队列收到的每条消息都将被转换为 DataModel
,而 路由键 将对应于它的 type()
。
例如,带有 /test
路由键的 RabbitMQ 消息将被具有 public const PATH = '/test';
的路由消费。