archict/brick

Archict 框架的基础库

v1.0.1 2024-09-14 08:43 UTC

README

Tests

要构建一些东西,你需要砖块

Archict 框架的基础库

什么是砖块?

砖块是 Archict 的基本组件。它由一组 服务 组成,这些服务可以有 配置 并可以监听 事件

如何创建一个砖块?

在技术层面上,砖块是一个具有 archict-brick 类型的 Composer 包。创建您自己的砖块最简单的方法是使用我们的 模板

如果您查看 composer.json 内容,您可以看到这一行

{
  "type": "archict-brick"
}

这一行非常重要,它告诉 Archict 您的包是一个砖块。没有它,您的服务永远不会被加载。

您还需要依赖于此包以获得创建砖块所需的全部必要类。

服务

创建一个服务相当简单,只需在您的类上放置 Service 属性即可

<?php

use Archict\Brick\Service;

#[Service]
final class MyService {}

服务的一个功能是依赖注入。您的服务可以依赖于其他服务(例如来自其他砖块的服务)。为此,只需在构造函数中添加它们,Archict 就会为您注入它们。

<?php

use Archict\Brick\Service;

#[Service]
final readonly class MyService 
{
    public function __construct(
        private AnotherService $another_service,
    ) {}
}

服务配置

有时,您需要让服务可以通过其他开发者进行配置。为此,您可以提供配置文件。为此,您需要做几件事情。

首先,您需要创建一个数据类来存储配置变量

<?php

final readonly class MyConfiguration 
{
    public function __construct(
        public int $nb_workers,
    ) {}
}

请注意,只有 public 成员将被视为配置的一部分。

然后指定您的服务可以使用此类作为配置(配置的实例也可以注入到服务的构造函数中)

<?php

use Archict\Brick\Service;

#[Service(MyConfiguration::class)]
final readonly class MyService 
{
    public function __construct(
        private MyConfiguration $config,
    ) {}
}

最后,在您的包根目录的 config 文件夹中提供一个默认配置文件(YAML 格式)。除非为 Archict 提供了另一个配置文件,否则将使用此文件作为默认配置。默认情况下,文件名称与您的服务类名小写相同(myservice.yml),您可以通过指定文件名来更改此行为

<?php

use Archict\Brick\Service;

#[Service(MyConfiguration::class, 'foo.yml')]
final readonly class MyService 
{
}

事件

为了给服务带来生命力,它们可以监听事件,甚至可以派发事件。

监听事件非常简单,只需将 ListeningEvent 属性添加到服务的一个公共方法中。Archict 将通过获取方法参数的类型来了解您正在监听哪个事件(因此您可以将方法命名为您想要的任何名称)

<?php

use Archict\Brick\ListeningEvent;
use Archict\Brick\Service;

#[Service]
final class MyService
{
    #[ListeningEvent]
    public function fooBarBaz(MyEvent $event): void
    {
        // Do something with $event
    }
}

派发事件需要几个步骤。首先,您需要一个事件类

<?php

final class MyEvent {}

然后,将包 archict/core 添加到您的依赖中。它包含必要的 EventDispatcher 服务,这是派发事件所必需的。现在您可以在服务中使用它来派发您的事件。

<?php

use Archict\Brick\Service;
use Archict\Core\Event\EventDispatcher;

#[Service]
final readonly class MyService
{
    public function __construct(
        private EventDispatcher $dispatcher,
    ) {}
    
    public function someMethod(): void
    {
        $this->dispatcher->dispatch(new MyEvent());
    }
}

如何使用砖块?

让我们去看看 Archict/core