За последние 24 часа нас посетили 11412 программистов и 659 роботов. Сейчас ищут 315 программистов ...

Можно ли внедрять сам контейнер при автовайринге?

Тема в разделе "PHP для профи", создана пользователем Вероломство, 23 ноя 2021.

  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    404
    Симпатии:
    13
    Суть такая: я использую контейнер в режиме автовайринга и мне нужно в резольвере внедрить контейнер, чтобы помещать в него хендлеры для последующей поддержки автовайринга уже в них:

    PHP:
    1. class Resolver
    2. {
    3.     private Container $container;
    4.  
    5.     public function __construct(Container $container)
    6.     {
    7.         $this->container = $container;
    8.     }
    9.  
    10.     public function resolve(string|array $handler): callable
    11.     {
    12.         if (is_string($handler)) {
    13.             return $this->container->get($handler);
    14.         }
    15.  
    16.         [$controller, $action] = $handler;
    17.  
    18.         $controller = $this->container->get($controller);
    19.  
    20.         return [$controller, $action];
    21.     }
    22. }
    Если я просто вот так буду использовать этот класс, то получается я внедряю пустой контейнер (новый его экземпляр) - это правильно?

    Или мне нужно в автосборщике контейнера указать:

    PHP:
    1. return [
    2.     Resolver::class => fn($container) => new Resolver($container)
    3. ];
    То есть правильно ли внедрять контейнер при автовайринге или нужно СУЩЕСТВУЮЩИЙ ЕГО экземпляр передать в нужное место?

    p.s. в контейнере пока не очень понимаю, гоняю пока разный код с его использованием, чтобы вникнуть на практике
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.195
    Симпатии:
    1.201
    Адрес:
    Лень
    у тебя ошибка на 10 строке. Ждешь результат callable, но в 20 массив
    --- Добавлено ---
    что находится ?
     
    Вероломство нравится это.
  3. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    404
    Симпатии:
    13
    PHP:
    1. $controller = $this->container->get($controller); // загнали экземпляр класса в контейнер и получили его
    2. return [$controller, $action];
    как-то так :)
    --- Добавлено ---
    @MouseZver в string - Class::class, в array - [Class::class, 'method']