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