В вашем 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
. Однако, возможно, существуют более чистые решения, если использовать способность расширить определения .