Skip to content

Archict/brick

Repository files navigation

Archict/Brick

Tests

To build something, you need bricks

Base library of Archict framework

What is a Brick?

A Brick is the base component of Archict. It consists on a collection of Services which can have a Configuration and listen to Event.

How to create a Brick?

In technical terms, a Brick is a composer package with the archict-brick type. The easiest way to create your own Brick is to use our template.

If you bring a look at the composer.json content, you can see this line:

{
  "type": "archict-brick"
}

This line is super mega important, it's the one telling to Archict that your package is a Brick. Without it, your Services will never be loaded.

You also need to depend on this package to have all the necessary classes to create your Brick.

Services

Creating a Service is pretty straight forward, just put the attribute Service on your class:

<?php

use Archict\Brick\Service;

#[Service]
final class MyService {}

One of the feature you can have with Services, is dependencies injection. Your Service can depend on some other Services (from other Bricks for example). For that, just add them in your constructor and Archict will inject them just for you.

<?php

use Archict\Brick\Service;

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

Services configuration

Sometimes, you need your Service to be configurable by another developer. For that you can give them configuration file. For that you need to do several things.

First you need to create a data class which store the configuration variables:

<?php

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

Please note that only public members will be considered as part of the configuration.

Then specify to your Service it can use this class as configuration (instance of your configuration can also be injected in the Service constructor):

<?php

use Archict\Brick\Service;

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

Finally, provide a default config file (in YAML format) in the config folder at the root of your package. This file will be used as default config unless another config file is provided to Archict. By default, the file is named with your Service class name lowercased (myservice.yml), you can change this behavior by specifying the filename:

<?php

use Archict\Brick\Service;

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

Events

To bring some life to your Services, they can listen to Events and even dispatch some.

Listening to an Event is pretty easy, just add the ListeningEvent attribute to a public method of your Service. Archict will know which Event you are listening by getting the argument type of the method (so you can name your method as you want):

<?php

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

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

Dispatching an Event need some steps. First you need to have an Event class:

<?php

final class MyEvent {}

Then add the package archict/core to your dependencies. It contains the Service EventDispatcher which is necessary to dispatch an Event. You can now use it in your Service to dispatch your Event.

<?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());
    }
}

How to use Bricks?

For that, let's go see Archict/core.