Новое в Symfony 5.1: Autowire общедоступных типизированных свойств

Типизированные свойства, представленные в PHP 7.4, являются одной из наиболее важных функций, добавленных PHP за последние годы. В Symfony 5.1 реализовали новые возможности на их основе, такие как извлечение информации о типизированных свойствах с помощью компонента PropertyInfo.

Рассмотрим этот пример, используя типизированные свойства:

use Twig\Environment;

class SomeServiceClass
{
    /** @required */
    public Environment $twig;

    public function someMethod()
    {
        $this->twig->render('...');
        // ...
    }
}

В предыдущих версиях Symfony этот пример не работал, потому что сервис Twig неправильно внедрен. В Symfony 5.1 этот пример будет работать как положено. Причина в том, что Symfony 5.1 автоматически связывает все общедоступные свойства, которые типизируются классами, относящимися к сервисам, и которые включают аннотацию @required.

Некоторые вещи для рассмотрения:

  • Только общедоступные объекты имеют автоматическую связь; защищенные и закрытые свойства никогда не будут автоматически подключены, чтобы избежать путаницы;
  • На практике это эквивалентно введению сеттера, что имеет недостатки и должно использоваться только в очень специфических сценариях.

Эта новая функция является лишь одним из многих инструментов, которые Symfony предоставляет вам для автоматизации настройки способов создания сервисов/объектов. Если это не подходит для разработки приложений, можно продолжать использовать традиционное внедрение служб, основанное на конструкторах и частных свойствах.