我有一个Slim (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'));但这一点:
那么,在中间件中注入这个记录器的正确方法是什么呢?
发布于 2019-11-20 19:33:33
在不将LoggerInterface作为命名条目添加到容器的情况下,您能直接通过$container->get()将LoggerInterface类注入中间件吗?例如,在routes.php应用程序函数中:
$container = $app->getContainer();
$app->add(new MiddleWare\MyAuthentication(..., $container->get(LoggerInterface::class)));发布于 2019-11-20 19:34:25
简而言之,我不认为您将能够自动连接中间件的依赖项,因为它们需要在附加到路由器之前构建。您需要像@Woodrow所建议的那样显式地注入依赖项,尽管我会选择方法注入而不是构造函数注入LoggerInterface,因为它将坚持LoggerAwareInterface。
发布于 2019-11-23 16:50:41
您可以让依赖注入容器(PHP)解析并将所有依赖项注入到中间件中:
LoggerInterface::class => function (ContainerInterface $container) {
return new Logger('name');
},然后用类名注册中间件:
$app->add(\MiddleWare\MyAuthentication::class);(不应将容器本身注入中间件)
就这样。
https://stackoverflow.com/questions/58961777
复制相似问题