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

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

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

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

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

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

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

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

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

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

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

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

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

Похожие вопросы