php-di как получить доступ к определениям контейнеров - PullRequest
1 голос
/ 03 июня 2019

У меня есть какой-то конфигурационный файл, который возвращает массив значений ключа

return [
    'my_key' => 'my value',
];

я добавил его в контейнер php-di как определение

$builder->addDefinitions(dirname(__DIR__) . '/config.php');
$container = $builder->build();

Вопрос в том, как получить доступ к данным из файла конфигурации внутри какого-либо метода класса, который используется внутри контейнера Di *?

допустим, у меня есть несколько классов

class App
{
    private $router;

    public function __construct(Router $router, Request $request)
    {
        $this->router = $router;
        $this->router->doSmth();
    }
}

class Router
{
    public function doSmth()
    {
       // how to access here to the config.php data to receive 'my value'
    }
}

поэтому, когда я звоню

$container->get('\Core\App');

все начинается, но я понятия не имею, как получить доступ к данным определений внутри методов зарегистрированных классов, потому что у меня нет экземпляра контейнера внутри самого контейнера, чтобы вызвать что-то вроде

$container->get('my_key'); // return 'my value'

Ответы [ 3 ]

1 голос
/ 04 июня 2019

В вашем App классе __constructor параметры вводятся. Так же, как и те, вы можете ввести конфигурацию туда.

Вы ссылаетесь на контейнер по типу, намекающему на класс ContainerInterface. Как уже упоминалось в проблеме на github , ваш код для App будет выглядеть следующим образом:

class App
{
    private $router;

    public function __construct(Router $router, Request $request, ContainerInterface $c)
    {
        $this->router = $router;
        $this->router->doSmth($c->get('my_key'));
    }
}

class Router
{
    public function doSmth($my_key)
    {
       // You now have access to that particular key from the settings
    }
}

Это сделает вашу Router зависимой от получения конфигурации с помощью функции doSmth().


В зависимости от того, как вы используете класс Router, вы можете потерять эту зависимость при вызове doSmth($my_key) с этим параметром конфигурации. Поскольку в классе App вы вводите класс Router, это означает, что вы также можете получить прибыль от инъекции в самом классе Router. Точно так же, как вы __construct ваш App класс, вы также можете сделать это с вашим Router классом.

Делаю это сейчас из головы, но это должно сработать, если я не ошибаюсь ...

Ваш код будет выглядеть так:

class App
{
    private $router;

    public function __construct(Router $router, Request $request)
    {
        $this->router = $router;
        $this->router->doSmth();
    }
}

class Router
{
    private $some_setting;

    public function __construct(ContainerInterface $c)
    {
       $this->some_setting = $c->get('my_key');
    }

    public function doSmth()
    {
       // You now have access to $this->some_setting
    }
}

Обратите внимание, что ключ my_key происходит непосредственно из определений контейнера PHP-DI, если, например, файл settings.php с массивом добавлен в качестве определений. Подробнее об определениях здесь . Поскольку я сам комбинирую это с платформой Slim, я обычно добавляю свои ключи в settings.php к settings., например, setting.my_key. Однако, возможно, существуют более чистые решения, если использовать способность расширить определения .

0 голосов
/ 04 июня 2019

Вам нужно настроить, что вводить в ваши объекты: http://php -di.org / doc / php-definitions.html # autowired-objects

0 голосов
/ 04 июня 2019

Если вы просто хотите получить значение, я думаю, вы можете просто использовать DI\get.

public function doSmth() {
    echo DI\get('my_key');
}

Отсюда: http://php -di.org / doc / environment.html

...