Search code examples
phpslim

Slimphp log from middleware


I have the following set up in a Slim PHP project using Monolog for logging but cannot log from middleware.

In dependdencies.php I have

$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;
};

Then in middleware.php I have

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

With App\Middleware\Logging being:

<?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);
}
}

How can I then log from another middleware file?

I also have 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);
}
}

But I get an error Call to a member function info() on null

Any help would be great.

Thanks


Solution

  • In your code, class CacheMiddleware has no member $logger. In class Logging you pass a logger instance to the constructor and set $this->logger accordingly, but in CacheMiddleware you don't.
    Do the same in the other class:

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

    and when you add a new instance of CacheMiddleware to the app middlewares, pass $container['logger'] to the constructor like you did with $app->add(new Logging($container->logger)); :

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