<?php
namespace App\AppBundle\EventListener;
use App\AdminBundle\Service\UserManager;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Psr\Log\LoggerInterface;
use App\AdminBundle\Entity\User;
class LoggerRequestResponseListener
{
protected $logger;
protected $userManager;
public function __construct(LoggerInterface $logger, UserManager $userManager)
{
$this->logger = $logger;
$this->userManager = $userManager;
}
public function onKernelController(ControllerEvent $event)
{
$controllerArray = $event->getController();
if (is_array($controllerArray)) {
if ($controllerArray[0] instanceof Controller) {
// Record controller name
$controllerNameString = 'Called controller "' .
get_class($controllerArray[0]) . '"';
// Record action name
$actionNameString = ', action "' . $controllerArray[1] . '"';
// Record called method
$methodString = ' (method ' . $event->getRequest()->getMethod() . ')';
// Record request URL parameters
$requestParams = $event->getRequest()->attributes->all()['_route_params'];
if (count($requestParams) > 0) {
$requestParamsString = ' with request URL params: ' .
json_encode($requestParams) . ',';
} else {
$requestParamsString = '';
}
// Record request query string, if any
if (count($_GET) > 0) {
$getQueryString = ' with query string params: ' . json_encode($_GET) .
',';
} else {
$getQueryString = '';
}
// Record who does the action
$user = $this->userManager->getLoggedUser();
if ($user instanceof User) {
$userMessageString = ' logged as user with id ' . $user->getId();
} else {
$userMessageString = ' by anonymous (not logged in) user ';
}
// Log the request about to be processed
$this->logger->info(
$controllerNameString .
$actionNameString .
$methodString .
$requestParamsString .
$getQueryString .
$userMessageString
);
}
} else {
$this->logger->info('Called controller as a closure');
}
}
public function onKernelResponse(ResponseEvent $event)
{
$response = $event->getResponse();
if ($response !== null) {
if ($response->getStatusCode() >= 400) {
// Get content info only on errors, which never expose sensitive information
$errorMessageString = ' and content: ' . $response->getContent();
} else {
$errorMessageString = '';
}
$this->logger->info('Exited controller with status code ' .
$response->getStatusCode() . $errorMessageString);
}
}
}