# 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```.