---
# System prepended metadata

title: Autowiring

---

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