PHP 中的依赖注入(苗条,php-di)

Dependency injection in PHP (slim, php-di)

我有一个 Slim Php (slim4) 应用程序,我在其中添加了 Monolog 用于日志记录。我像这样将记录器添加到应用程序中:

$containerBuilder->addDefinitions([
  LoggerInterface::class => function (ContainerInterface $c) {
     $logger = new Logger('appname');
     ...
     return $logger

这对于在我的大部分 类 中注入记录器来说效果很好,只需执行以下操作:

public function __construct(ContainerInterface $container = null, LoggerInterface $logger)
{
    // I can use $logger here

现在我也想在身份验证等中间件中使用记录器。我不知道如何正确地做到这一点。 我 可以 通过将记录器添加为容器中的命名条目来实现此功能,如下所示:

$containerBuilder->addDefinitions([
  "LoggerInterface" => function (ContainerInterface $c) {

然后通过从容器取回它作为构造函数参数传递给中间件:

$middlewares[] = new MyAuthentication(..., $container->get('LoggerInterface'));

但是这个:

那么在中间件中注入这个记录器的正确方法是什么?

如果不将 LoggerInterface 作为命名条目添加到容器中,您是否可以通过 $container->get()LoggerInterface class 直接注入您的中间件? IE。在 routes.php 应用函数中:

$container = $app->getContainer();
$app->add(new MiddleWare\MyAuthentication(..., $container->get(LoggerInterface::class)));

简而言之,我认为您无法自动连接中间件的依赖项,因为它们需要在附加到路由器之前构建。您需要按照@Woodrow 的建议显式注入依赖项,尽管我会为 LoggerInterface 选择方法注入而不是构造函数注入,因为它会遵守 LoggerAwareInterface。

您可以让依赖项注入容器 (PHP-DI) 解析并将所有依赖项注入您的中间件:

LoggerInterface::class => function (ContainerInterface $container) {
    return new Logger('name');
},

然后用class名称注册中间件:

$app->add(\MiddleWare\MyAuthentication::class);

(你不应该将容器本身注入中间件)

就这些了。