# Autowiring Недавно мы включили [autowiring](https://php-di.org/doc/autowiring.html). Это удобная фича, позволяющая автоматически создавать и инъектить зависимости. Теперь создавать классы и передавать в них зависимости стало проще. Покажу на примере: ## Как было Мы хотим создать класс c двумя зависимостями ```OrderService.php``` ```php class OrderService { public function __construct( OrderReader $orderReader, DBs $dbs ) { ... } } ``` Нам нужно было описать в bootstrap или deps* зависимости ```bootstrap.php``` ```php ... OrderReader::class => function() { return new OrderReader(...); } DBs::class => function() { return new Dbs(...); } OrderService::class => function(ContainerInterface $c) { return new OrderService( $c->get(OrderReader::class), $c->get(Dbs::class), ); } ... ``` ## Как стало Теперь достаточно просто указать зависимости в констуркторе и они подтянутся контейнером автоматически: ```OrderService.php``` ```php class OrderService { public function __construct( OrderReader $orderReader, DBs $dbs ) { ... } } ``` ## Замечания 1. Полностью от файла bootstrap избавиться не получится. Там останутся константы и классы, которые создаются от одного и того же производного класса. ```bootstrap.php``` ```php ... 'is_local' => function(ContainerInterface $c): bool { return (bool)$c->get('config')['cdn.sBaseDomain']; }, ... 'MasterDB' => function(ContainerInterface $c) { return new DB( 'Master', ... ); }, 'SlaveDB' => function(ContainerInterface $c) { return new DB( 'Slave', ... ); }, ``` 2. Так же там останутся описания для классов, в которые должны передаваться зависимости, упомянутые выше: ```php PrepWriter::class => function(ContainerInterface $c) { return new PrepWriter( $c->get(PrepReader::class), $c->get('MasterDB'), $c->get('ip') ... ); }, ``` 3. Обратите внимание, что описывать зависимости со строковым ключом можно только для случаев из **п.1**. Во всех остальных случаях нужно использовать ```ClassName::class```.