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'));
但是这个:
- a) 通过类名中断另一个 类
的注入
- b) 是
apparently 不是最佳做法
那么在中间件中注入这个记录器的正确方法是什么?
如果不将 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);
(你不应该将容器本身注入中间件)
就这些了。
我有一个 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'));
但是这个:
- a) 通过类名中断另一个 类 的注入
- b) 是 apparently 不是最佳做法
那么在中间件中注入这个记录器的正确方法是什么?
如果不将 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);
(你不应该将容器本身注入中间件)
就这些了。