Commit c43275e2 authored by Wolfgang Ziegler's avatar Wolfgang Ziegler
Browse files

Issue #3305775 by fago, useernamee: Alter cache context when request attributes are used

parent b4bedf59
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -35,3 +35,8 @@ services:
    arguments: ['@lupus_ce_renderer.custom_elements_renderer']
    tags:
      - { name: event_subscriber }
  lupus_ce_renderer.request_subscriber:
    class: Drupal\lupus_ce_renderer\EventSubscriber\CustomElementsRequestSubscriber
    arguments: ['@router.route_provider']
    tags:
      - { name: event_subscriber }
+1 −1
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ class CustomElementsFormatSubscriber implements EventSubscriberInterface {
    // Dis-allow html format when custom elements rendering is enabled. Other
    // formats like 'json' should be allowed, so custom APIs can be added.
    // @todo: Make this alterable somehow.
    if (($request->attributes->get('lupus_ce_renderer') || Settings::get('lupus_ce_renderer_enable', FALSE)) && $request->getRequestFormat('custom_elements') == 'html') {
    if ($request->attributes->get('lupus_ce_renderer') && $request->getRequestFormat('custom_elements') == 'html') {
      // Throw status 406 http exception, but take care to not run in an
      // end-less loop here.
      if (!$event->getRequest()->attributes->get('exception') || !$event->getRequest()->attributes->get('exception') instanceof NotAcceptableHttpException) {
+67 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\lupus_ce_renderer\EventSubscriber;

use Drupal\Core\Routing\CacheableRouteProviderInterface;
use Drupal\Core\Routing\RouteProviderInterface;
use Drupal\Core\Site\Settings;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;

/**
 * Request subscriber for customizing route cache IDs.
 */
class CustomElementsRequestSubscriber implements EventSubscriberInterface {

  /**
   * The route provider.
   *
   * @var \Drupal\Core\Routing\RouteProviderInterface
   */
  protected $routeProvider;

  /**
   * Constructs the object.
   *
   * @param \Drupal\Core\Routing\RouteProviderInterface $routeProvider
   *   The route provider.
   */
  public function __construct(RouteProviderInterface $routeProvider) {
    $this->routeProvider = $routeProvider;
  }

  /**
   * Handles the request.
   *
   * @param \Symfony\Component\HttpKernel\Event\RequestEvent $event
   *   The event.
   */
  public function onRequest(RequestEvent $event) {
    $request = $event->getRequest();

    // Make it easy to check whether the lupus_ce_renderer is enabled by
    // making sure it gets set into the attributes.
    if (Settings::get('lupus_ce_renderer_enable', FALSE)) {
      $request->attributes->set('lupus_ce_renderer', TRUE);
    }

    // We change the routing default format. Make sure the routing system
    // takes that into account when caching.
    if ($this->routeProvider instanceof CacheableRouteProviderInterface) {
      $this->routeProvider->addExtraCacheKeyPart('lupus_ce_renderer', $request->attributes->get('lupus_ce_renderer') ? 1 : 0);
    }
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    return [
      // Must run before Symfony's router listener (priority 32)
      // @see \Symfony\Component\HttpKernel\EventListener\RouterListener::getSubscribedEvents()
      KernelEvents::REQUEST => ['onRequest', 40],
    ];
  }

}
+0 −5
Original line number Diff line number Diff line
@@ -36,11 +36,6 @@ class CustomElementsRequestFormatRouteFilter extends RequestFormatRouteFilter im
  protected function getDefaultFormatForRequest(RouteCollection $collection, Request $request): string {
    $formats = static::getAvailableFormats($collection);

    // Make it easy to check whether the lupus_ce_renderer is enabled.
    if (Settings::get('lupus_ce_renderer_enable', FALSE)) {
      $request->attributes->set('lupus_ce_renderer', TRUE);
    }

    // The default format is applied unless ALL routes require the same format.
    // However, we do not allow using "html" if lupus_ce_renderer is active.
    if (count($formats) === 1) {