medbrat69
@medbrat69
Основатель toster.ru

Как соблюсти принцип последней буквы SOLID?

Пару дней работаю с шаблоном "Внедрение зависимости", появилась несколько вопросов:

1. Допустим, у меня есть зависимость для роутера в виде контроллера. Заранее неизвестно, какой это контроллер, будет известно во время выполнения программы. Экземпляр контроллера создается в роутере. Как мне обеспечить роутер контроллером? Ведь я не могу написать $controllerObj = new $controller();, потому что создается зависимость от класса какого-то контроллера.

Мое решение: передать зависимость в роутер в виде абстрактного контроллера, а его потомки автоматически подсосутся в рантайме.

2. Что делать, если один из контроллеров-потомков нуждается в какой-то зависимости? Видел решение, где DI-контейнер через конструкторы контроллеров передавался все ниже и ниже по цепочке туда, где он нужен. Это норм решение? Но тогда ведь создается зависимость от самого контейнера. Как тогда быть?

Мое решение: нет.

В общем, хочу, чтобы наставили на путь истинный, сказали, в том направлении ли я мыслю и правильно ли решение моей первой проблемы.
  • Вопрос задан
  • 1338 просмотров
Решения вопроса 1
@Wentixon
Во-первых, я советую тебе не заниматься херней, проходя всякие тупые курсы и делая свои велосипеды. Поверь, эти курсы тебя ничему хорошему не научат, я сам это все прошел - толку ровно ноль. У тебя все равно ничего хорошего не получится, так как лучшие разработчики годами оттачивают свои фреймворки, при чем заимствуя фишки друг у друга (речь идет о популярных фреймворках).

Во-вторых, если все же у тебя шило в попе, хочется какую то херню погородить, то умные люди придумали некоторые стандарты. Условным стандартом в php являются компоненты с самого качественного фреймворка symfony, на которых кстати основан также laravel. Вот компонент роутера например. Популярные фреймворки состоят из таких мелких независимых компонентов.

В-третьих, на будущее.. Прежде чем что то делать, посмотри как это сделано у других. Компонент роута я тебе дал, хочешь свой пилить (хотя это абсолютно бессмысленно), то пожалуйста, но лучше ты 100% не сделаешь, так что просто посмотри как сделано у них хотя бы.

Ну а теперь отвечу на твой вопрос. Контроллеры привязываются к роутеру извне, так что внутри никаких привязок не будет. И вообще, тут не стоит говорить о SOLID, так как это этап загрузки приложения. Никто не может быть уверенным, что такой контроллер вообще найдется и в нем будет присутствовать такой метод, так что в этом случае просто будет исключение.

Кстати можешь посмотреть эти курсы, самое толковое из того что есть
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
dmitriylanets
@dmitriylanets
веб-разработчик
php666
@php666
PHP-макака
Без кода ничего не ясно.
Ответ написан
Комментировать
customtema
@customtema
arint.ru
  1. Абстрагировать роутинг, разделив его как минимум на две части (два слоя)
  2. Конечно нет
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы