Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/fi1a/facade
Фасад (Facade)
https://github.com/fi1a/facade
facade php
Last synced: about 1 month ago
JSON representation
Фасад (Facade)
- Host: GitHub
- URL: https://github.com/fi1a/facade
- Owner: fi1a
- License: mit
- Created: 2023-02-01T00:27:03.000Z (almost 2 years ago)
- Default Branch: master
- Last Pushed: 2023-02-21T00:52:45.000Z (almost 2 years ago)
- Last Synced: 2024-05-19T12:03:07.121Z (8 months ago)
- Topics: facade, php
- Language: PHP
- Homepage:
- Size: 13.7 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Фасад (Facade)
[![Latest Version][badge-release]][packagist]
[![Software License][badge-license]][license]
[![PHP Version][badge-php]][php]
![Coverage Status][badge-coverage]
[![Total Downloads][badge-downloads]][downloads]
[![Support mail][badge-mail]][mail]Фасады предоставляют "статический" интерфейс для классов,
используют динамические методы для проксирования вызовов методов к объектам, созданным в фабричном методе.## Установка
Установить этот пакет можно как зависимость, используя Composer.
``` bash
composer require fi1a/facade
```## Использование
Допустим у нас есть класс `Foo\Bar`.
```php
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`.```php
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` через фасад.
```php
echo \Facades\BarFacade::baz()->qux('value'); // "value"
```Фвбричный метод может возвращать всегда новый экземпляр класса или единожды созданный. Создание экземпляра класса
можно возложить на [Dependency injection container](https://github.com/fi1a/dependency-injection).Пример единожды созданного через Dependency injection container экземпляра класса.
Сначала необходимо в конфигурацию Dependency injection container задать определение созданное с помощью builder'а:```php
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
```php
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
}
}
```[badge-release]: https://img.shields.io/packagist/v/fi1a/facade?label=release
[badge-license]: https://img.shields.io/github/license/fi1a/facade?style=flat-square
[badge-php]: https://img.shields.io/packagist/php-v/fi1a/facade?style=flat-square
[badge-coverage]: https://img.shields.io/badge/coverage-100%25-green
[badge-downloads]: https://img.shields.io/packagist/dt/fi1a/facade.svg?style=flat-square&colorB=mediumvioletred
[badge-mail]: https://img.shields.io/badge/mail-support%40fi1a.ru-brightgreen[packagist]: https://packagist.org/packages/fi1a/facade
[license]: https://github.com/fi1a/facade/blob/master/LICENSE
[php]: https://php.net
[downloads]: https://packagist.org/packages/fi1a/facade
[mail]: mailto:[email protected]