rxthunder/skeleton

基于事件驱动的CLI微框架,具有响应式编程特性,用于分叉和玩耍,适合生产环境

1.0.0 2020-01-10 14:07 UTC

This package is auto-updated.

Last update: 2024-09-11 00:05:16 UTC


README

License License

关于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.phpcomposer.json的自动加载。

现在,您的Route将通过PATH常量与相应的DataModel一起调用。

额外:处理器概念

我个人使用 src/routesrc/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'; 的路由消费。