Mercurial > hg > isophonics-drupal-site
view core/lib/Drupal/Core/Routing/LazyRouteEnhancer.php @ 13:5fb285c0d0e3
Update Drupal core to 8.4.7 via Composer. Security update; I *think* we've
been lucky to get away with this so far, as we don't support self-registration
which seems to be used by the so-called "drupalgeddon 2" attack that 8.4.5
was vulnerable to.
author | Chris Cannam |
---|---|
date | Mon, 23 Apr 2018 09:33:26 +0100 |
parents | 4c8ae668cc8c |
children |
line wrap: on
line source
<?php 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; } }