Проблема
FakerPHP поддерживает модификаторы
valid() и unique(), но их нельзя использовать одновременно (например, fake()->unique()->valid()). Появилась необходимость добавить такую функциональность, не нарушая работы Laravel и не создавая сложностей при обновлении фреймворка.Изучение механизма
Функция
fake() в Laravel возвращает объект \Faker\Generator, который создаётся через фабрику и привязывается к контейнеру как синглтон. Это усложняет задачу: нельзя просто заменить объект через наследование, так как это потребует повторной реализации логики фабрики.Решение
Автор предлагает использовать шаблон декоратора, который позволяет добавлять новые возможности к существующему объекту, не изменяя его напрямую.
🔸Создание класса-декоратора
Был создан класс FakerGenerator, принимающий базовый объект \Faker\Generator и добавляющий метод
uniqueAndValid(). Этот класс также использует трейт Laravel ForwardsCalls, чтобы проксировать вызовы отсутствующих методов к оригинальному объекту.🔸Интеграция в Laravel
Класс FakerGenerator был зарегистрирован в контейнере через метод
extend() в провайдере AppServiceProvider. Это позволяет Laravel использовать новый декоратор вместо стандартного генератора при вызове fake()Результат
Теперь вызовы
fake()->uniqueAndValid()->randomElement() работают корректно, а все остальные методы генератора по-прежнему доступны благодаря механизму проксирования.