class MainContentViewSubscriber

Same name and namespace in other branches
  1. 9 core/lib/Drupal/Core/EventSubscriber/MainContentViewSubscriber.php \Drupal\Core\EventSubscriber\MainContentViewSubscriber
  2. 8.9.x core/lib/Drupal/Core/EventSubscriber/MainContentViewSubscriber.php \Drupal\Core\EventSubscriber\MainContentViewSubscriber
  3. 10 core/lib/Drupal/Core/EventSubscriber/MainContentViewSubscriber.php \Drupal\Core\EventSubscriber\MainContentViewSubscriber

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

render . main_content_renderer;

, then \Drupal\Core\Render\MainContent\MainContentRenderersPass will detect it and use it when appropriate.

Hierarchy

  • class \Drupal\Core\EventSubscriber\MainContentViewSubscriber implements \Symfony\Component\EventDispatcher\EventSubscriberInterface

Expanded class hierarchy of MainContentViewSubscriber

See also

\Drupal\Core\Render\MainContent\MainContentRendererInterface

\Drupal\Core\Render\MainContentControllerPass

25 files declare their use of MainContentViewSubscriber
AjaxHelperTrait.php in core/lib/Drupal/Core/Ajax/AjaxHelperTrait.php
AreaDisplayLinkTest.php in core/modules/views/tests/src/Kernel/Handler/AreaDisplayLinkTest.php
BlockLibraryController.php in core/modules/block/src/Controller/BlockLibraryController.php
ContentModerationConfigureEntityTypesForm.php in core/modules/content_moderation/src/Form/ContentModerationConfigureEntityTypesForm.php
DisplayLink.php in core/modules/views/src/Plugin/views/area/DisplayLink.php

... See full list

File

core/lib/Drupal/Core/EventSubscriber/MainContentViewSubscriber.php, line 25

Namespace

Drupal\Core\EventSubscriber
View source
class MainContentViewSubscriber implements EventSubscriberInterface {
    
    /**
     * The class resolver service.
     *
     * @var \Drupal\Core\DependencyInjection\ClassResolverInterface
     */
    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\ViewEvent $event
     *   The event to process.
     */
    public function onViewRenderArray(ViewEvent $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}
     */
    public static function getSubscribedEvents() : array {
        $events[KernelEvents::VIEW][] = [
            'onViewRenderArray',
        ];
        return $events;
    }

}

Members

Title Sort descending Modifiers Object type Summary
MainContentViewSubscriber::$classResolver protected property The class resolver service.
MainContentViewSubscriber::$mainContentRenderers protected property The available main content renderer services, keyed per format.
MainContentViewSubscriber::$routeMatch protected property The current route match.
MainContentViewSubscriber::getSubscribedEvents public static function
MainContentViewSubscriber::onViewRenderArray public function Sets a response given a (main content) render array.
MainContentViewSubscriber::WRAPPER_FORMAT constant URL query attribute to indicate the wrapper used to render a request.
MainContentViewSubscriber::__construct public function Constructs a new MainContentViewSubscriber object.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.