Я перехожу из Globals и Singletons (= bad?) В Injections of Dependency (= good?) В PHP, и я очень к этому знаком.Понравилось с впрыском зависимостей в 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);
Разве это не слишком много?
Я знаю, что кто-то может советовать использовать какой-то большой класс «Приложения» и поместить объекты Config, Session, Log, Db внутри этого класса, но я чувствую, что это не очень хорошая идея.
Следующий вопрос - что делать, если мне нужно получить идентификатор пользователя внутри моего FrontPageController? Я не передал экземпляр «Пользователь» в 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" кажется мне излишним.
Связанные: http://stackoverflow.com/questions/4603555/how-to-deal-with-constructor-over-injection-in-net/4603666#4603666 –