fi1a / facade
Фасад (Facade)
Requires
- php: ^7.3 || ^8
Requires (Dev)
- captainhook/captainhook: ^5.4
- phpunit/phpunit: ^9.3
- slevomat/coding-standard: ^6.3
- squizlabs/php_codesniffer: ^3.5
- vimeo/psalm: ^4.3
This package is auto-updated.
Last update: 2024-12-21 05:10:51 UTC
README
Фасады предоставляют "статический" интерфейс для классов, используют динамические методы для проксирования вызовов методов к объектам, созданным в фабричном методе.
Установка
Установить этот пакет можно как зависимость, используя 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 } }