{"id":22178037,"url":"https://github.com/fi1a/facade","last_synced_at":"2025-03-24T18:26:38.214Z","repository":{"id":65698083,"uuid":"595860087","full_name":"fi1a/facade","owner":"fi1a","description":"Фасад (Facade)","archived":false,"fork":false,"pushed_at":"2023-02-21T00:52:45.000Z","size":14,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-02T05:54:15.829Z","etag":null,"topics":["facade","php"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fi1a.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-02-01T00:27:03.000Z","updated_at":"2023-02-06T04:05:38.000Z","dependencies_parsed_at":"2024-12-02T08:45:09.335Z","dependency_job_id":null,"html_url":"https://github.com/fi1a/facade","commit_stats":{"total_commits":5,"total_committers":1,"mean_commits":5.0,"dds":0.0,"last_synced_commit":"0219fcabe4a38adfa2bd6aedc03ec1d33e3610b6"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fi1a%2Ffacade","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fi1a%2Ffacade/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fi1a%2Ffacade/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fi1a%2Ffacade/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fi1a","download_url":"https://codeload.github.com/fi1a/facade/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245326960,"owners_count":20597123,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["facade","php"],"created_at":"2024-12-02T08:34:29.727Z","updated_at":"2025-03-24T18:26:38.191Z","avatar_url":"https://github.com/fi1a.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Фасад (Facade)\n\n[![Latest Version][badge-release]][packagist]\n[![Software License][badge-license]][license]\n[![PHP Version][badge-php]][php]\n![Coverage Status][badge-coverage]\n[![Total Downloads][badge-downloads]][downloads]\n[![Support mail][badge-mail]][mail]\n\nФасады предоставляют \"статический\" интерфейс для классов,\nиспользуют динамические методы для проксирования вызовов методов к объектам, созданным в фабричном методе.\n\n## Установка\n\nУстановить этот пакет можно как зависимость, используя Composer.\n\n``` bash\ncomposer require fi1a/facade\n```\n\n## Использование\n\nДопустим у нас есть класс `Foo\\Bar`.\n\n```php\nnamespace Foo;\n\nclass Bar\n{\n    public function baz()\n    {\n        return $this;\n    }\n    \n    public function qux(string $value): string\n    {\n        return $value;\n    }\n}\n```\n\nДля доступа к его методам через \"статический\" интерфейс используется фасад `Facades\\BarFacade`.\nЛюбые фасады, должны расширять абстрактный класс `Fi1a\\Facade\\AbstractFacade` и реализовывать метод\n`protected static function factory(): object` возвращающий экземпляр объекта класса.\nВ примере метод `protected static function factory(): object` возвращает экземпляр класса `Foo\\Bar`.\n\n```php\nnamespace Facades;\n\nuse Fi1a\\Facade\\AbstractFacade;\nuse Foo\\Bar;\n\n/**\n * Фасад класса Foo\\Bar\n *\n * @method static Bar baz()\n * @method static string qux(string $value)\n */\nclass BarFacade extends AbstractFacade\n{\n\n    /**\n     * @inheritDoc\n     */\n    protected static function factory(): object\n    {\n        return new Bar();\n    }\n}\n```\n\nВызов методов класса `Foo\\Bar` через фасад.\n\n```php\necho \\Facades\\BarFacade::baz()-\u003equx('value'); // \"value\"\n```\n\nФвбричный метод может возвращать всегда новый экземпляр класса или единожды созданный. Создание экземпляра класса\nможно возложить на [Dependency injection container](https://github.com/fi1a/dependency-injection).\n\nПример единожды созданного через Dependency injection container экземпляра класса.\nСначала необходимо в конфигурацию Dependency injection container задать определение созданное с помощью builder'а:\n\n```php\ndi()-\u003econfig()-\u003eaddDefinition(\n    Builder::build(Foo\\BarInterface::class)\n        -\u003edefineFactory(function () {\n            static $instance;\n            \n            if ($instance === null) {\n                $instance = new Foo\\Bar();            \n            }\n            \n            return $instance;\n        })\n        -\u003egetDefinition()\n);\n```\n\nФасад использующий Dependency injection container\n\n```php\nnamespace Facades;\n\nuse Fi1a\\Facade\\AbstractFacade;\nuse Foo\\Bar;\n\n/**\n * Фасад класса Foo\\Bar\n *\n * @method static Bar baz()\n * @method static string qux(string $value)\n */\nclass BarFacade extends AbstractFacade\n{\n\n    /**\n     * @inheritDoc\n     */\n    protected static function factory(): object\n    {\n        return di()-\u003eget(Foo\\BarInterface::class); // Foo\\BarInterface\n    }\n}\n```\n\n[badge-release]: https://img.shields.io/packagist/v/fi1a/facade?label=release\n[badge-license]: https://img.shields.io/github/license/fi1a/facade?style=flat-square\n[badge-php]: https://img.shields.io/packagist/php-v/fi1a/facade?style=flat-square\n[badge-coverage]: https://img.shields.io/badge/coverage-100%25-green\n[badge-downloads]: https://img.shields.io/packagist/dt/fi1a/facade.svg?style=flat-square\u0026colorB=mediumvioletred\n[badge-mail]: https://img.shields.io/badge/mail-support%40fi1a.ru-brightgreen\n\n[packagist]: https://packagist.org/packages/fi1a/facade\n[license]: https://github.com/fi1a/facade/blob/master/LICENSE\n[php]: https://php.net\n[downloads]: https://packagist.org/packages/fi1a/facade\n[mail]: mailto:support@fi1a.ru","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffi1a%2Ffacade","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffi1a%2Ffacade","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffi1a%2Ffacade/lists"}