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

Но вообще гугл в этом деле очень помогает.
Ответы: >>1382746
Аноним 2019/04/17 09:42:33  №1382746 3
>>1382741
Настройка и связь с бд у меня в bootstrap.php лежит, там же создаётся и объект tablegateway. Вопрос в том,правильно ли я понял, что контроллеру можно просто объект этот передать, как передал валидатору (по совету опа), или это разные вещи. Больше никакого барахла не будет, проект же небольшой(список студентов).
Походу я немного запутался уже в этих абстракциях.
Ответы: >>1382756
Аноним 2019/04/17 10:10:12  №1382756 4
>>1382746
>контроллеру можно просто объект этот передать
Конечно можно. Только, бога ради, не в роутере - ему вообще не положено знать о таких вещах.
Ответы: >>1382791
Аноним 2019/04/17 11:24:22  №1382791 5
>>1382756
А как тогда? Роутер же создаёт контроллер нужный и запускает его метод начала работы.
Ответы: >>1382986 >>1382989
Аноним 2019/04/17 15:25:30  №1382986 6
>>1382791
>Роутер же создаёт контроллер нужный
Вообще не его обязанность, как по мне. Можно роутер сделать конструктором объекта Route, т.е. настоящего маршрута, который отрабатывает в данный момент.
В него, например, передавать имя контроллера, метода, параметры вызова(гет\пост и тд), ну уже потом в него и передавать зависимости, Хотя тут контейнер тоже удобнее будет.
Ну а потом $Route->run(), который собирает всё это дело воедино и посылает на рендер.
Уж лучше так, чем в роутер гейтвей сущности пихать.
Ответы: >>1383031
Аноним 2019/04/17 15:29:39  №1382989 7
>>1382791
А вообще, с таким подходом ты просто обречен убрать инициализацю gateway из bootstrap и запихнуть её в сам контроллер. Конструктор или прямо в методе.
Ответы: >>1383031
Аноним 2019/04/17 16:48:48  №1383031 8
>>1382989
>>1382986
Вообще почитал я про контейнеры у опа и это не так уж и сложно, как я думал, сделаю через него лучше и объект контейнера запихну в роутер.
Ответы: >>1383060
Аноним 2019/04/17 17:42:01  №1383060 9
>>1383031
>не так уж и сложно
Это ещё и удобно, уж поверь.
Аноним 2019/04/21 00:38:31  №1385181 10
>>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 11