EventSubscriber.php in JS Callback Handler 8.3
File
src/EventSubscriber.php
View source
<?php
namespace Drupal\js;
use Drupal\Core\Render\AttachmentsResponseProcessorInterface;
use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RouteCollection;
class EventSubscriber extends RouteSubscriberBase {
protected $js;
protected $jsAttachmentsProcessor;
public function __construct(Js $js, AttachmentsResponseProcessorInterface $js_attachments_processor) {
$this->js = $js;
$this->jsAttachmentsProcessor = $js_attachments_processor;
}
public function alterRoutes(RouteCollection $collection) {
if (($endpoint = \Drupal::config('js.settings')
->get('endpoint')) && $endpoint !== '/js' && ($route = $collection
->get('js.callback'))) {
$route
->setPath($endpoint);
}
}
public static function getSubscribedEvents() {
$events = parent::getSubscribedEvents();
$events[KernelEvents::EXCEPTION] = 'onException';
$events[KernelEvents::REQUEST] = 'onRequest';
$events[KernelEvents::RESPONSE][] = [
'onResponse',
-1000,
];
return $events;
}
public function onException(GetResponseForExceptionEvent $event) {
$request = $event
->getRequest();
if ($this->js
->isExecuting($request)) {
$this->js
->exceptionHandler($event
->getException());
}
}
public function onRequest(GetResponseEvent $event) {
$request = $event
->getRequest();
if ($this->js
->isExecuting($request)) {
ob_start();
if (!$this->js
->silencePhpErrors()) {
set_error_handler([
$this->js,
'errorHandler',
]);
set_exception_handler([
$this->js,
'exceptionHandler',
]);
register_shutdown_function([
$this->js,
'fatalErrorHandler',
]);
}
}
}
public function onResponse(FilterResponseEvent $event) {
$response = $event
->getResponse();
if ($response instanceof JsResponse) {
$this->jsAttachmentsProcessor
->processAttachments($response);
$response
->setHeader('Content-Type', $response
->getMimeType() . '; charset=utf-8');
}
}
}