symfony4 Внедрение зависимостей в трейт. trait. dependency injection.

В Symfony рекомендуется внедрять зависимости для использования в классе через конструктор - заполняя необходимыми объектами поля.

Как же инициализировать объект зависимости в трейте, если он не инициализирован в классе, использующем трейт?

Решение

Добавим в трейт сеттер с аннотацией @required:

<?php

namespace App\Controller;

use App\Entity\User;
use Symfony\Component\Security\Core\Security;

/**
 * Трейт для работы с авторизованым пользователем
 */
trait AuthorizedUserTrait
{
    /**
     * @var Security
     */
    private $security;

    /**
     * @param Security $security
     * 
     * @required
     */
    public function setSecurity(Security $security)
    {
        $this->security = $security;
    }
    
    /**
     * @return User
     */
    private function getAuthorizedUser(): User
    {
        return $this->security->getUser();
    }
}

Возможно Вам сможет помочь какой-то другой метод.

Источники