Я перехожу из Globals and Singletons (= плохо?) В Dependency Injection (= хорошо?) В PHP, и я очень новичок в этом.
Я уже прочитал много связанных тем о переполнении стека, но до сих пор не могу понять основные принципы DI.
Скажите, пожалуйста, правильно ли я делаю (это просто сокращенный псевдокод):
// first connect to DB
$sql = new Sql();
// create logger (I'm writing logs to Database so I need to pass $sql to it)
$log = new Log($sql);
// restore logged in user, get info about user, unread messages...
// class "User" needs access to Database and Logs:
$user = new User($sql, $log);
// now we need to collect all the data of current section of my Website
// I'm using Model and Controller:
$model = new FrontPageModel($sql, $user, $log);
$pageController = new FrontPageController($model);
Хотя на этом этапе это может выглядеть нормально, но что, если мне нужно получить доступ к большему количеству классов, таких как Config, Session и т. Д .?
Должен ли мой код преобразоваться в это?
$model = new FrontPageModel($sql, $user, $log, $config, $session);
Не слишком ли это уже много?
Я знаю, что кто-то может посоветовать использовать своего рода большой класс "Application" и поместить объекты Config, Session, Log, Db в этот класс, но я чувствую, что это не очень хорошая идея.
Следующий вопрос - что, если мне нужно зарегистрировать идентификатор пользователя в моем FrontPageController? Я не передавал экземпляр «User» в FrontPageController, но он был передан (в цепочке) в FronPageModel.
class FrontPageController{
private $model;
function __construct($model){
$this->model = $model;
}
function getData(){
echo $this->model->user->id; // is it right way?
}
}
То, что "$ this-> model-> user-> id" мне кажется излишним.