Я создаю среду MVC PHP, и мне интересно, каковы наилучшие практики для загрузки того, что мне нужно в моих классах, будь то другие классы или простая конфигурация.
До сегодняшнего дня я использовал синглтоны,реестр и в последнее время контейнер внедрения зависимости.В то время как многие люди утверждают, что DI - это путь, мне кажется, что это справедливо переносит проблему соединения между компонентами в другое место.
Синглтоны вводят глобальное состояние, реестр вводит тесную связь, а DI вводит ..Ну, много сложностей.Я все еще в замешательстве и не могу найти правильный способ связать свои занятия друг с другом.
Тем временем я придумал индивидуальное решение.На самом деле это не решение, оно просто абстрагирует реализацию загрузки служб из моего кода.
Я создал абстрактный класс с помощью методов _load_service и _load_config, которые расширяют все компоненты моей платформы для загрузки других служб или конфигурации..
abstract class Base_Component {
function _load_service($service) {
// could be either
return DI_container::getInstance()->$service;
// or
$class = '\services\\'.$service;
return new $class;
// or other implementation
}
}
Реализация их загрузки теперь реализована только в одном месте, базовом классе, так что, по крайней мере, я избавился от строк кода, подобных следующему, в мои компоненты:
$database = new Database(Registry::getInstance()->load('db_config'));
или
$database = DI_container::getInstance()->database;
Теперь, если мне нужен экземпляр базы данных, я делаю это
$database = $this->_load_service('database');
, и реализация загрузчика службы, контейнера, реестра или чего-либо еще может быть легко изменена в одном классеметод без необходимости искать весь мой код, чтобы изменить вызовы к какой-либо реализации контейнера, которую я использовал раньше.
Но, как я уже сказал, я даже не совсем уверен, какой метод я буду использовать для загрузки классов и конфигурации.
Ваше мнение?