Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Использование DI позволяет не задумываться над тем, в каком контексте будет использоваться ваш модуль. Дает возможность переносить отдельный класс в другой проект без набора (часто иерархического) зависимостей. При использовании аннотаций вам не придётся заниматься явным созданием объектов и явной передачей параметров и сервисов в объект. И, конечно, такой класс в разы проще поддается тестированию, нежели завязанный на статические методы или явно создающий экземпляры класса, вместо использования фабрики.
Каким образом вы избавитесь от зависимостей?
Что мешает даже при использвании DI засунуть в класс статики?
Почему класс созданный через фабрику легче подается тестированию?
$m = new Model();
$m->setValue('a', 1);
return $m;
$m = $this->modelFactory()->create();
$m->setValue('a', 1);
return $m;
Подразумевается зависимость от конкретных классов. При описанном подходе во-первых возможно изменить используемый класс через настройки сервис локатора, во вторых явно задать реализацию сервиса (при наличии set- метода).
— Почему класс созданный через фабрику легче подается тестированию?
— И в тесте, подменяя фабрику, мы можем через метод modelFactory()->create() вернуть mock объект, для которого проверим однократный вызов setValue() с ожидаемыми параметрами.
Если у вас где-то используется entity manager — перенести класс в проект без доктрины уже нельзя.
Если реально стоит вопрос тестирования, лучше заюзайте AspectMock.
Что выпрыгнет из черного ящика?
DI реально усложняет код.
Если не планируется замена сервисов...
Почему же, достаточно определить свой entity manager.
это совершенно не значит, что проектируя с DI мы свободно сможем заменять любые компоненты.
$m = $this->modelFactory()->create();
$m->setValue('a', 1);
return $m;
Использование DI ничему не мешает, оно позволяет этого не делать.
Подразумевается зависимость от конкретных классов. При описанном подходе во-первых возможно изменить используемый класс через настройки сервис локатора, во вторых явно задать реализацию сервиса (при наличии set- метода).
В данном куске кода нужно тестировать именно create.
Вы описали выгоды использования DI для DI.
Метод create() протестирован в тесте фабрики. Метод __construct() тестируется в тесте класса, в котором он объявлен.
В данном куске кода проверяется работа тестируемого сервиса, а не используемых в нем.
Причём тут DI?
Как начать использовать DI