diff --git a/page_manager.services.yml b/page_manager.services.yml index 359b18f..ee637e4 100644 --- a/page_manager.services.yml +++ b/page_manager.services.yml @@ -21,7 +21,7 @@ services: - { name: 'event_subscriber' } page_manager.variant_route_filter: class: Drupal\page_manager\Routing\VariantRouteFilter - arguments: ['@entity.manager'] + arguments: ['@entity.manager', '@router.matcher.final_matcher', '@paramconverter_manager'] tags: - { name: route_filter } page_manager.executable_factory: diff --git a/src/Routing/VariantRouteFilter.php b/src/Routing/VariantRouteFilter.php index dd06a23..12a8c0a 100644 --- a/src/Routing/VariantRouteFilter.php +++ b/src/Routing/VariantRouteFilter.php @@ -9,7 +9,9 @@ use Drupal\Core\Display\ContextAwareVariantInterface; use Drupal\Core\Entity\EntityManagerInterface; +use Drupal\Core\ParamConverter\ParamConverterManagerInterface; use Drupal\Core\Routing\RouteFilterInterface; +use Symfony\Cmf\Component\Routing\NestedMatcher\FinalMatcherInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; @@ -25,10 +27,24 @@ class VariantRouteFilter implements RouteFilterInterface { protected $pageStorage; /** - * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager + * @var \Symfony\Cmf\Component\Routing\NestedMatcher\FinalMatcherInterface */ - public function __construct(EntityManagerInterface $entity_manager) { + protected $finalMatcher; + + /** + * @var \Drupal\Core\ParamConverter\ParamConverterManagerInterface + */ + protected $paramConverterManager; + + /** + * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager + * @param \Symfony\Cmf\Component\Routing\NestedMatcher\FinalMatcherInterface $final_matcher + * @param \Drupal\Core\ParamConverter\ParamConverterManagerInterface $param_converter_manager + */ + public function __construct(EntityManagerInterface $entity_manager, FinalMatcherInterface $final_matcher, ParamConverterManagerInterface $param_converter_manager) { $this->pageStorage = $entity_manager->getStorage('page'); + $this->finalMatcher = $final_matcher; + $this->paramConverterManager = $param_converter_manager; } /** @@ -45,6 +61,9 @@ public function applies(Route $route) { public function filter(RouteCollection $collection, Request $request) { $new_collection = NULL; $page = NULL; + + $this->prepareRequest($collection, $request); + foreach ($collection as $name => $route) { /** @var \Symfony\Component\Routing\Route $route */ $defaults = $route->getDefaults(); @@ -71,4 +90,13 @@ public function filter(RouteCollection $collection, Request $request) { return $new_collection ?: $collection; } + /** + * @todo. + */ + protected function prepareRequest(RouteCollection $collection, Request $request) { + $attributes = $this->finalMatcher->finalMatch($collection, $request); + $attributes = $this->paramConverterManager->convert($attributes); + $request->attributes->add($attributes); + } + }