«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2019/04/17 04:39:03  №1382653 1
В задании про список студентов оп говорит, что валидатору инфы о студенте нужно в конструктор передавать объект tablegateway, чтобы валидатор мог, например, смотреть, есть ли а базе такой email. Контроллерам тоже нужно будет вызывать методы tablegateway, чтобы работать с базой. Значит в конструктор контроллера надо передавать тоже этот объект tablegateway? А если у меня объект контроллера в роутере создаётся, то сначала объект tablegateway нужно в роутер передавать прямо из index.php? Это и есть Di?
Ответы: >>1382741 >>1385181
Аноним 2019/04/21 00:38:31  №1385181 2
>>1382653

Если следовать принципу DI, то да, в контроллер надо передавать нужные ему объекты (зависимости) снаружи. Соответственно, создание контроллера мы поручаем DI контейнеру, который и передаст ему эти зависимости. Роутер берет контроллер из контейнера, а не создает сам.

Но на практике контроллеры часто исключают из DI, так как это все равно не повторно используемый код, и просто передают в конструктор контроллера только DI контейнер, а контроллер уже сам берет из него то, что ему нужно. Это отступление от принципов DI/IoC.

И роутер (который на самом деле Front Controller, а не просто роутер) можно исключить из DI по той же причине.

> А если у меня объект контроллера в роутере создаётся, то сначала объект tablegateway нужно в роутер передавать прямо из index.php? Это и есть Di?

В DI обычно объекты создает DI контейнер, а не роутер. В роутер проще передать DI контейнер и брать контроллеры из него. Хотя, если тебе очень хочется, можно и для роутера задействовать DI, передавая в него все объекты контроллеров снаружи, и сам роутер поместить в DI контейнер.

Ответы: >>1385271
Аноним 2019/04/21 08:47:53  №1385271 3