За последние 24 часа нас посетили 20142 программиста и 1077 роботов. Сейчас ищут 674 программиста ...

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

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

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

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

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

    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.734
    Симпатии:
    1.315
    Адрес:
    Лень
    у тебя ошибка на 10 строке. Ждешь результат callable, но в 20 массив
    --- Добавлено ---
    что находится ?
     
    Вероломство нравится это.
  3. Вероломство

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

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

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    С o_O

    2022-08-03_11-43-07.png

    Ты реально с ноября еще не понял ?????? o_Oo_Oo_Oo_Oo_Oo_Oo_O НАXУЙ
     
  5. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    @MouseZver ты реально не читал пост 3? )))

    при возврате в $controller уже не строка, а экземпляр ($controller = $container->get($controller)), поэтому возвращается валидная callable, чувак ээээ будь внимательнее
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    у тебя массив возвращается type array
    открой глаза, 20 строка. Тему в топку
     
  7. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    @MouseZver ты же вроде вчера со мной не бухал за ВДВ

    смотри

    в string - Class::class, в array - [Class::class, 'method']

    PHP:
    1. [$controller, $action] = [Class::class, 'method'];
    2.  
    3. $controller = $this->container->get($controller); // $controller = $this->container->get(Class::class);
    4.  
    5. return [$controller, $action]; // callable
    )))

    PHP:
    1. return [$this->container->get(Class::class), $action]; // )))
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    откуда у тебя тип callable, когда ты возвращаешь [ МАССИВ ]
     
  9. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    ну ты даёшь дядя)))

    PHP:
    1. call_user_func([/* ку-ку ёпта */]);
    Что у нас тут - МАССИВ? Какой тип у него? ))) Массив может быть вызван, как функция, поэтому он - callable )))
     
    #9 Вероломство, 3 авг 2022
    Последнее редактирование: 3 авг 2022
  10. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    @MouseZver контрольный

    PHP:
    1. class A{
    2.     public function test()
    3.     {
    4.         echo __METHOD__;
    5.     }
    6. }
    7.  
    8. $a = [new A(), 'test'];
    9.  
    10. var_dump(is_callable($a)); // true
    11.  
    12. $a(); // A::test
    троллинг засчитан :)
     
    #10 Вероломство, 3 авг 2022
    Последнее редактирование: 3 авг 2022
  11. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    ох е6ать ниxуя се, callable тип умеет конвертировать/задействовать функционал. Я этого не знал, соррянчик.
     
    Вероломство нравится это.