-
-
Notifications
You must be signed in to change notification settings - Fork 1
Feature Factory interfaces
По интерфейсу-фабрике с методами вида create(...): Product контейнер генерирует реализацию: рантайм-аргументы метода передаются в конструктор продукта по имени, остальные зависимости — автовайрятся (аналог Nette auto-factory / PHP-DI factory interfaces).
FactoryInterfaceGenerator::generate($container, FactoryInterface::class) создаёт (через eval, с кэшированием класса) реализацию интерфейса. Каждый метод собирает свой return-тип: для каждого параметра конструктора берётся одноимённый аргумент метода, иначе — сервис по типу из контейнера (значение по умолчанию / null — как fallback).
interface ReportFactory
{
public function create(string $title): Report; // Report(string $title, Clock $clock)
}
$factory = (new FactoryInterfaceGenerator())->generate($container, ReportFactory::class);
$report = $factory->create('Q4'); // Report('Q4', <автовайренный Clock>)- Типобезопасные фабрики без бойлерплейта — пишете только интерфейс, реализацию генерирует контейнер.
- Рантайм-аргументы + автовайринг зависимостей в одном вызове.
- Класс-реализация кэшируется —
evalодин раз на интерфейс.
- Требует
eval(генерация кода) — в отличие от «обычного» autowiring. - Методы должны возвращать класс; union/intersection-параметры не поддерживаются (понятная ошибка).
- Когда сервису нужна фабрика с рантайм-аргументом (id заказа, имя, конфиг) поверх внедрённых зависимостей.
- Держать методы фабрики простыми:
create(<рантайм-аргументы>): <Продукт>.
- Прятать за фабрикой сложную логику сборки — тогда честнее явная фабрика-класс.
- Фабрика-интерфейс с методами без class-return-типа.
| Контейнер | Аналог |
|---|---|
| PHP-DI | нет генерации по интерфейсу ( |
| Symfony |
#[AutowireCallable] / factory-сервисы ( |
| Laravel | нет (❌) |
| Pimple | нет (❌) |
| Nette | auto-factory по интерфейсу (эталон) |
CloudCastle и Nette генерируют реализацию фабрики прямо из интерфейса.
См. также: Сервис-фабрики в конфиге · Constructor autowiring.
CloudCastle DI · · PHP 8.1+ · PSR-11
GitHub · Packagist · Releases · Discussions · Сравнение
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)
- 🏗️ Архитектура
- ⚡ Быстрый старт
- 📊 Сравнение — 5 аналогов, таблица + победители
- 🧩 Возможности (детально) — каждая фича: принцип, +/−, аналоги
- 🧪 Bootstrap
- 🚀 Compiled container
- 🔗 Contextual binding
- 🤖 Autowiring
- 📄 Конфигурация
- 📖 Справочник конфигурации
- 📂 Сканирование классов
- 🌍 Глобальный реестр
- 🏷️ Теги и декораторы
- 🔗 call(), bind(), hooks
- 🔄 Прототипы, alias, lazy, lazyGhost
- 📋 Справочник API
- 🏭 Фабрики и singleton