Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 30
LazyRouteEnhancer
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 4
182
0.00% covered (danger)
0.00%
0 / 30
 __construct
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 setEnhancers
0.00% covered (danger)
0.00%
0 / 1
42
0.00% covered (danger)
0.00%
0 / 12
 getEnhancers
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 7
 enhance
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 9
<?php
/**
 * @file
 * Contains \Drupal\Core\Routing\LazyRouteEnhancer.
 */
namespace Drupal\Core\Routing;
use Drupal\Core\Routing\Enhancer\RouteEnhancerInterface;
use Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface as BaseRouteEnhancerInterface;
use Symfony\Cmf\Component\Routing\RouteObjectInterface;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\RouteCollection;
/**
 * A route enhancer which lazily loads route enhancers, depending on the route.
 *
 * We lazy initialize route enhancers, because otherwise all dependencies of
 * all route enhancers are initialized on every request, which is slow. However,
 * with the use of lazy loading, dependencies are instantiated only when used.
 */
class LazyRouteEnhancer implements BaseRouteEnhancerInterface, ContainerAwareInterface {
  use ContainerAwareTrait;
  /**
   * Array of enhancers service IDs.
   *
   * @var array
   */
  protected $serviceIds = [];
  /**
   * The initialized route enhancers.
   *
   * @var \Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface[]|\Drupal\Core\Routing\Enhancer\RouteEnhancerInterface[]
   */
  protected $enhancers = NULL;
  /**
   * Constructs the LazyRouteEnhancer object.
   *
   * @param $service_ids
   *   Array of enhancers service IDs.
   */
  public function __construct($service_ids) {
    $this->serviceIds = $service_ids;
  }
  /**
   * For each route, saves a list of applicable enhancers to the route.
   *
   * @param \Symfony\Component\Routing\RouteCollection $route_collection
   *   A collection of routes to apply enhancer checks to.
   */
  public function setEnhancers(RouteCollection $route_collection) {
    /** @var \Symfony\Component\Routing\Route $route **/
    foreach ($route_collection as $route_name => $route) {
      $service_ids = [];
      foreach ($this->getEnhancers() as $service_id => $enhancer) {
        if ((!$enhancer instanceof RouteEnhancerInterface) || $enhancer->applies($route)) {
          $service_ids[] = $service_id;
        }
      }
      if ($service_ids) {
        $route->setOption('_route_enhancers', array_unique($service_ids));
      }
    }
  }
  /**
   * For each route, gets a list of applicable enhancer to the route.
   *
   * @return \Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface[]|\Drupal\Core\Routing\Enhancer\RouteEnhancerInterface[]
   */
  protected function getEnhancers() {
    if (!isset($this->enhancers)) {
      foreach ($this->serviceIds as $service_id) {
        $this->enhancers[$service_id] = $this->container->get($service_id);
      }
    }
    return $this->enhancers;
  }
  /**
   * {@inheritdoc}
   */
  public function enhance(array $defaults, Request $request) {
    /** @var \Symfony\Component\Routing\Route $route */
    $route = $defaults[RouteObjectInterface::ROUTE_OBJECT];
    $enhancer_ids = $route->getOption('_route_enhancers');
    if (isset($enhancer_ids)) {
      foreach ($enhancer_ids as $enhancer_id) {
        $defaults = $this->container->get($enhancer_id)->enhance($defaults, $request);
      }
    }
    return $defaults;
  }
}