代码之家  ›  专栏  ›  技术社区  ›  davidjh

来自中间件的Slimphp日志

  •  0
  • davidjh  · 技术社区  · 7 年前

    我在一个使用monog进行日志记录的Slim PHP项目中设置了以下内容,但无法从中间件进行日志记录。

    在dependencies.php中

    $container['logger'] = function ($c) {
        $settings = $c->get('settings')['logger'];
        $logger = new Monolog\Logger($settings['name']);
        $logger->pushProcessor(new Monolog\Processor\UidProcessor());
        $logger->pushHandler(new Monolog\Handler\StreamHandler($settings['path'], $settings['level']));
        return $logger;
    };
    

    然后在middleware.php中

    use App\Middleware\Logging;
    $app->add(new Logging($container->logger));
    

    应用程序\中间件\日志记录为:

    <?php
    
    namespace App\Middleware;
    
    class Logging
    {
    
    public function __construct($logger)
    {
        $this->logger = $logger;
    }
    
    public function __invoke($request, $response, $next)
    {
        $routeParams = $request->getAttribute('routeInfo')[2];
        $this->logger->info($request->getMethod() . " -- " . $request->getUri());
        return $next($request, $response);
    }
    }
    

    然后如何从另一个中间件文件登录?

    我还有App/Middleware/CacheMiddleware

    <?php
    
    namespace  App\Middleware;
    
    use Psr\Http\Message\RequestInterface;
    use Psr\Http\Message\ResponseInterface;
    
    class CacheMiddleware
    {
    public function __invoke(RequestInterface $request, ResponseInterface $response, callable $next)
    {
        //$this->logger->info('test');
        $response->getBody()->write('BEFORE');
        return $next($request, $response);
    }
    }
    

    但我犯了个错误 Call to a member function info() on null

    任何帮助都很好。

    谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   Nima    7 年前

    在你的代码中,类 CacheMiddleware 没有成员 $logger . 课堂上 Logging 将一个logger实例传递给构造函数并设置 $this->logger 因此,但是 缓存中间件 你没有。
    在另一节课上也这样做:

    class CacheMiddleware
    {
    
        public function __construct($logger)
            {
                $this->logger = $logger;
            }
        // rest of class definition
    }
    

    当您添加 缓存中间件 到应用程序中间件,通过 $container['logger'] 像你对构造器做的那样 $app->add(new Logging($container->logger)); :

    $app->add(new CacheMiddleware($container->logger));