Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 3 |
CRAP | |
0.00% |
0 / 18 |
MainContentViewSubscriber | |
0.00% |
0 / 1 |
|
0.00% |
0 / 3 |
72 | |
0.00% |
0 / 18 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
onViewRenderArray | |
0.00% |
0 / 1 |
42 | |
0.00% |
0 / 12 |
|||
getSubscribedEvents | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\EventSubscriber\MainContentViewSubscriber. | |
*/ | |
namespace Drupal\Core\EventSubscriber; | |
use Drupal\Core\Cache\CacheableMetadata; | |
use Drupal\Core\Cache\CacheableResponseInterface; | |
use Drupal\Core\DependencyInjection\ClassResolverInterface; | |
use Drupal\Core\Routing\RouteMatchInterface; | |
use Symfony\Component\EventDispatcher\EventSubscriberInterface; | |
use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent; | |
use Symfony\Component\HttpKernel\KernelEvents; | |
/** | |
* View subscriber rendering main content render arrays into responses. | |
* | |
* Additional target rendering formats can be defined by adding another service | |
* that implements \Drupal\Core\Render\MainContent\MainContentRendererInterface | |
* and tagging it as a @code render.main_content_renderer @endcode, then | |
* \Drupal\Core\Render\MainContent\MainContentRenderersPass will detect it and | |
* use it when appropriate. | |
* | |
* @see \Drupal\Core\Render\MainContent\MainContentRendererInterface | |
* @see \Drupal\Core\Render\MainContentControllerPass | |
*/ | |
class MainContentViewSubscriber implements EventSubscriberInterface { | |
/** | |
* The class resolver service. | |
* | |
* @var \Drupal\Core\Controller\ControllerResolverInterface | |
*/ | |
protected $classResolver; | |
/** | |
* The current route match. | |
* | |
* @var \Drupal\Core\Routing\RouteMatchInterface | |
*/ | |
protected $routeMatch; | |
/** | |
* The available main content renderer services, keyed per format. | |
* | |
* @var array | |
*/ | |
protected $mainContentRenderers; | |
/** | |
* URL query attribute to indicate the wrapper used to render a request. | |
* | |
* The wrapper format determines how the HTML is wrapped, for example in a | |
* modal dialog. | |
*/ | |
const WRAPPER_FORMAT = '_wrapper_format'; | |
/** | |
* Constructs a new MainContentViewSubscriber object. | |
* | |
* @param \Drupal\Core\DependencyInjection\ClassResolverInterface $class_resolver | |
* The class resolver service. | |
* @param \Drupal\Core\Routing\RouteMatchInterface $route_match | |
* The current route match. | |
* @param array $main_content_renderers | |
* The available main content renderer service IDs, keyed by format. | |
*/ | |
public function __construct(ClassResolverInterface $class_resolver, RouteMatchInterface $route_match, array $main_content_renderers) { | |
$this->classResolver = $class_resolver; | |
$this->routeMatch = $route_match; | |
$this->mainContentRenderers = $main_content_renderers; | |
} | |
/** | |
* Sets a response given a (main content) render array. | |
* | |
* @param \Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent $event | |
* The event to process. | |
*/ | |
public function onViewRenderArray(GetResponseForControllerResultEvent $event) { | |
$request = $event->getRequest(); | |
$result = $event->getControllerResult(); | |
// Render the controller result into a response if it's a render array. | |
if (is_array($result) && ($request->query->has(static::WRAPPER_FORMAT) || $request->getRequestFormat() == 'html')) { | |
$wrapper = $request->query->get(static::WRAPPER_FORMAT, 'html'); | |
// Fall back to HTML if the requested wrapper envelope is not available. | |
$wrapper = isset($this->mainContentRenderers[$wrapper]) ? $wrapper : 'html'; | |
$renderer = $this->classResolver->getInstanceFromDefinition($this->mainContentRenderers[$wrapper]); | |
$response = $renderer->renderResponse($result, $request, $this->routeMatch); | |
// The main content render array is rendered into a different Response | |
// object, depending on the specified wrapper format. | |
if ($response instanceof CacheableResponseInterface) { | |
$main_content_view_subscriber_cacheability = (new CacheableMetadata())->setCacheContexts(['url.query_args:' . static::WRAPPER_FORMAT]); | |
$response->addCacheableDependency($main_content_view_subscriber_cacheability); | |
} | |
$event->setResponse($response); | |
} | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
static function getSubscribedEvents() { | |
$events[KernelEvents::VIEW][] = ['onViewRenderArray']; | |
return $events; | |
} | |
} |