Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. MainContentViewSubscriber.php

class 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

7 files declare their use of MainContentViewSubscriber
AjaxHelperTrait.php in core/lib/Drupal/Core/Ajax/AjaxHelperTrait.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
FormAjaxSubscriber.php in core/lib/Drupal/Core/Form/EventSubscriber/FormAjaxSubscriber.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 Overriden Title
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 Returns an array of event names this subscriber wants to listen to. Overrides EventSubscriberInterface::getSubscribedEvents
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.
RSS feed
Powered by Drupal