fi1a/facade

Фасад (Facade)

dev-master 2023-02-21 00:52 UTC

This package is auto-updated.

Last update: 2024-04-21 03:38:48 UTC


README

Latest Version Software License PHP Version Coverage Status Total Downloads Support mail

Фасады предоставляют "статический" интерфейс для классов, используют динамические методы для проксирования вызовов методов к объектам, созданным в фабричном методе.

Установка

Установить этот пакет можно как зависимость, используя Composer.

composer require fi1a/facade

Использование

Допустим у нас есть класс Foo\Bar.

namespace Foo;

class Bar
{
    public function baz()
    {
        return $this;
    }
    
    public function qux(string $value): string
    {
        return $value;
    }
}

Для доступа к его методам через "статический" интерфейс используется фасад Facades\BarFacade. Любые фасады, должны расширять абстрактный класс Fi1a\Facade\AbstractFacade и реализовывать метод protected static function factory(): object возвращающий экземпляр объекта класса. В примере метод protected static function factory(): object возвращает экземпляр класса Foo\Bar.

namespace Facades;

use Fi1a\Facade\AbstractFacade;
use Foo\Bar;

/**
 * Фасад класса Foo\Bar
 *
 * @method static Bar baz()
 * @method static string qux(string $value)
 */
class BarFacade extends AbstractFacade
{

    /**
     * @inheritDoc
     */
    protected static function factory(): object
    {
        return new Bar();
    }
}

Вызов методов класса Foo\Bar через фасад.

echo \Facades\BarFacade::baz()->qux('value'); // "value"

Фвбричный метод может возвращать всегда новый экземпляр класса или единожды созданный. Создание экземпляра класса можно возложить на Dependency injection container.

Пример единожды созданного через Dependency injection container экземпляра класса. Сначала необходимо в конфигурацию Dependency injection container задать определение созданное с помощью builder'а:

di()->config()->addDefinition(
    Builder::build(Foo\BarInterface::class)
        ->defineFactory(function () {
            static $instance;
            
            if ($instance === null) {
                $instance = new Foo\Bar();            
            }
            
            return $instance;
        })
        ->getDefinition()
);

Фасад использующий Dependency injection container

namespace Facades;

use Fi1a\Facade\AbstractFacade;
use Foo\Bar;

/**
 * Фасад класса Foo\Bar
 *
 * @method static Bar baz()
 * @method static string qux(string $value)
 */
class BarFacade extends AbstractFacade
{

    /**
     * @inheritDoc
     */
    protected static function factory(): object
    {
        return di()->get(Foo\BarInterface::class); // Foo\BarInterface
    }
}