Как это сделать?
У меня есть класс Model, который является родительским для многих подклассов, и эта Модель зависит от соединения с базой данных и механизма кэширования.
Теперь вот тут-то и начинаются проблемы: я не контролирую, как создается и используется каждый объект, но у меня есть контроль над методами, которые используются подклассами.
В настоящее время я прибегаю к использованию статических методов и свойств для внедрения зависимостей, например:
class Model
{
private static $database_adapter;
private static $cache_adapter;
public static function setDatabaseAdapter(IDatabaseAdapter $databaseAdapter)
{
self::$databaseAdapter = $databaseAdapter;
}
public static function setCacheAdapter(ICacheAdapter $cacheAdapter)
{
self::$cacheAdapter = $cacheAdapter;
}
}
Что сработало хорошо, но кажется грязным (оно создает глобальное состояние для всех моделей).
Я рассмотрел шаблон фабрики, но он снимает контроль создания экземпляров с подклассов (как создать экземпляр объекта с переменным числом параметров в его конструкторе?).
Теперь я в растерянности. Любая помощь будет оценена.