Skip to content

Feature Factory interfaces

github-actions[bot] edited this page Jul 8, 2026 · 1 revision

🏭 Генерируемые фабрики-интерфейсы

← Возможности · Главная · Сравнение

По интерфейсу-фабрике с методами вида 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.

Clone this wiki locally