diff --git a/core/modules/layout/layout.admin.inc b/core/modules/layout/layout.admin.inc
deleted file mode 100644
index 63fe122378b..00000000000
--- a/core/modules/layout/layout.admin.inc
+++ /dev/null
@@ -1,34 +0,0 @@
-getDefinition($key);
- drupal_set_title(t('View template %name', array('%name' => $layout['title'])), PASS_THROUGH);
-
- // Render the layout in an admin context with region demonstrations.
- $instance = Drupal::service('plugin.manager.layout')->createInstance($key, array());
- $regions = $instance->getRegions();
- foreach ($regions as $region => $info) {
- $regions[$region] = '
' . check_plain($info['label']) . '
';
- }
- $build['demonstration'] = array(
- '#markup' => $instance->renderLayout(TRUE, $regions),
- );
- $build['#attached']['css'][] = drupal_get_path('module', 'layout') . '/css/layout.admin.css';
- return $build;
-}
diff --git a/core/modules/layout/layout.module b/core/modules/layout/layout.module
index 8c0f29dcd75..3d915268b04 100644
--- a/core/modules/layout/layout.module
+++ b/core/modules/layout/layout.module
@@ -16,29 +16,11 @@ function layout_menu() {
);
$items['admin/structure/templates/manage/%'] = array(
'title' => 'View template',
- 'page callback' => 'layout_page_view',
- 'page arguments' => array(4),
- 'access callback' => 'layout_user_access',
- 'access arguments' => array(4),
- 'file' => 'layout.admin.inc',
+ 'route_name' => 'layout_page_view',
);
return $items;
}
-/**
- * Access callback: Checks the existence of a layout.
- *
- * @param string $key
- * The key of the page layout being requested.
- *
- * @return bool
- * TRUE if the current user can access page layout menu items; FALSE
- * otherwise.
- */
-function layout_user_access($key) {
- return (user_access('administer layouts') && Drupal::service('plugin.manager.layout')->getDefinition($key));
-}
-
/**
* Implements hook_permission().
*/
diff --git a/core/modules/layout/layout.routing.yml b/core/modules/layout/layout.routing.yml
index d1cd540ac34..f7a18299ce5 100644
--- a/core/modules/layout/layout.routing.yml
+++ b/core/modules/layout/layout.routing.yml
@@ -4,3 +4,13 @@ layout_page_list:
_content: '\Drupal\layout\Controller\LayoutController::layoutPageList'
requirements:
_permission: 'administer layouts'
+
+layout_page_view:
+ pattern: '/admin/structure/templates/manage/{key}'
+ defaults:
+ _content: '\Drupal\layout\Controller\LayoutController::layoutPageView'
+ options:
+ _access_mode: 'ALL'
+ requirements:
+ _permission: 'administer layouts'
+ _access_layout_user: 'TRUE'
diff --git a/core/modules/layout/layout.services.yml b/core/modules/layout/layout.services.yml
index d387b77b161..c882dd9b6ec 100644
--- a/core/modules/layout/layout.services.yml
+++ b/core/modules/layout/layout.services.yml
@@ -2,3 +2,8 @@ services:
plugin.manager.layout:
class: Drupal\layout\Plugin\Type\LayoutManager
arguments: ['@container.namespaces']
+ access_check.layout:
+ class: Drupal\layout\Access\LayoutAccessCheck
+ arguments: ['@plugin.manager.layout']
+ tags:
+ - { name: access_check }
diff --git a/core/modules/layout/lib/Drupal/layout/Access/LayoutAccessCheck.php b/core/modules/layout/lib/Drupal/layout/Access/LayoutAccessCheck.php
new file mode 100644
index 00000000000..2c76dba3b39
--- /dev/null
+++ b/core/modules/layout/lib/Drupal/layout/Access/LayoutAccessCheck.php
@@ -0,0 +1,51 @@
+layoutManager = $layout_manager;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function appliesTo() {
+ return '_access_layout_user';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function access(Route $route, Request $request) {
+ return $this->layoutManager->getDefinition($request->attributes->get('key')) ? static::ALLOW : static::DENY;
+ }
+
+}
diff --git a/core/modules/layout/lib/Drupal/layout/Controller/LayoutController.php b/core/modules/layout/lib/Drupal/layout/Controller/LayoutController.php
index b9ad7f97bfa..246b62866c0 100644
--- a/core/modules/layout/lib/Drupal/layout/Controller/LayoutController.php
+++ b/core/modules/layout/lib/Drupal/layout/Controller/LayoutController.php
@@ -1,4 +1,5 @@
layoutManager->getDefinition($key);
+ drupal_set_title(t('View template %name', array('%name' => $layout['title'])), PASS_THROUGH);
+
+ // Render the layout in an admin context with region demonstrations.
+ $instance = $this->layoutManager->createInstance($key, array());
+ $regions = $instance->getRegions();
+ foreach ($regions as $region => $info) {
+ $regions[$region] = '' . String::checkPlain($info['label']) . '
';
+ }
+ $build['demonstration']['#markup'] = $instance->renderLayout(TRUE, $regions);
+
+ // @todo Convert layout.admin.css to a library.
+ $build['#attached']['css'][] = drupal_get_path('module', 'layout') . '/layout.admin.css';
+ return $build;
+ }
+
}