Как решить проблему составления класса Controller в PHP, который должен быть:
- легко проверяемый, используя инъекцию зависимостей,
- предоставить общие объекты для конечного программиста
- предоставить способ загружать новые пользовательские библиотеки
Посмотрите вниз, для создания экземпляра контроллера с инфраструктурой внедрения зависимостей
Проблема состоит в том, что производные контроллеры могут использовать любые ресурсы, на которые программист хочет (например, предоставляет инфраструктуру). Как создать единый доступ к общим ресурсам (DB, User, Storage, Cache, Helpers), определенные пользователем классы или другие библиотеки?
Элегантное решение?
Есть несколько возможных решений моей проблемы, но никто не выглядит элегантным
- Попробуйте передать все общедоступные объекты конструктором ? (может создавать конструктор даже с 10 заполнителями)
- Создать getters, settters? (раздутый код)
$controller->setApplication($app)
- Применить сильные синглеты на общих ресурсах?
User::getInstance()
илиDatabase::getInstance()
- Использовать контейнер для инъекций как одноэлемент для совместного использования объектов внутри контроллера
- предоставить одно глобальное приложение singleton как factory? (этот выглядит очень часто в php-фреймворках, он сильно противоречит принципам DI и закону Деметры).
Я понимаю, что создание сильно связанных классов обескураживается и изгоняется за:), однако я не знаю, как эта парадигма применяется к отправной точке для других программистов (класс Controller), в которых они должны иметь доступ общие ресурсы, предоставляемые архитектуре MVC. Я считаю, что разбиение класса контроллера на более мелкие классы каким-то образом разрушит практический смысл MVC.
Инъекционная платформа зависимостей
Схема DI выглядит как жизнеспособный выбор. Однако проблема все еще сохраняется. Класс, такой как Controller, не находится на уровне приложения, а на уровне RequestHandler/Response.
Как этот слой должен создать экземпляр контроллера?
- передать инжектор DI в этот слой?
- Плата DI как одноэлемент?
- установить изолированную конфигурацию DI-рамки только для этого слоя и создать отдельный экземпляр инжектора DI?