Boris Böhne
Drupal Developer, Sindelfingen, Germany
04/02/2015
function forum_menu() {
...
$items['admin/structure/forum/add/container'] = array(
'title' => 'Add container',
'page callback' => 'forum_form_main',
'page arguments' => array('container'),
'access arguments' => array('administer forums'),
'type' => MENU_LOCAL_ACTION,
'parent' => 'admin/structure/forum',
'file' => 'forum.admin.inc',
);
...
}
Example from D7 (forum.module)
function forum_menu() {
...
$items['admin/structure/forum/add/container'] = array(
'title' => 'Add container',
'page callback' => 'forum_form_main',
'page arguments' => array('container'),
'access arguments' => array('administer forums'),
'type' => MENU_LOCAL_ACTION,
'parent' => 'admin/structure/forum',
'file' => 'forum.admin.inc',
);
...
}
Nice, but...
Routing +
access control +
menu item +
...
Separation of concerns?
~ path / url
~ callback
...
forum.add_container:
path: '/admin/structure/forum/add/container'
defaults:
_controller: '\Drupal\forum\Controller\ForumController::addContainer'
_title: 'Add container'
requirements:
_permission: 'administer forums'
...
forum.routing.yml
namespace Drupal\forum\Controller;
use ...
class ForumController extends ControllerBase {
...
/**
* Returns add container entity form.
*
* @return array
* Render array for the add form.
*/
public function addContainer() {
$vid = $this->config('forum.settings')->get('vocabulary');
$taxonomy_term = $this->termStorage->create(array(
'vid' => $vid,
'forum_container' => 1,
));
return $this->entityFormBuilder()->getForm($taxonomy_term, 'container');
}
...
}
ForumController.php
/admin/structure/forum/add/container
forum.index:
title: Forums
route_name: forum.index
menu_name: tools
forum.overview:
title: Forums
parent: system.admin_structure
description: 'Control forum hierarchy settings.'
route_name: forum.overview
Example: forum.links.menu.yml
forum.overview:
route_name: forum.overview
base_route: forum.overview
title: List
forum.settings:
route_name: forum.settings
base_route: forum.overview
title: Settings
weight: 100
Example: forum.links.task.yml
/admin/structure/forum
function forum_permission() {
$perms = array(
'administer forums' => array(
'title' => t('Administer forums'),
),
);
return $perms;
}
administer forums:
title: 'Administer forums'
Drupal 7: hook_permission()
Drupal 8: forum.permission.yml
function forum_menu() {
...
'access callback' => 'user_access',
'access arguments' => array('administer forums'),
...
}
...
requirements:
_permission: 'administer forums'
...
Drupal 7: hook_menu()
Drupal 8: forum.routing.yml
...
requirements:
_permission: 'access content'
...
requirements:
_user_is_logged_in: 'TRUE'
...
requirements:
_role: 'administrator'
...
requirements:
_entity_access: 'node.view'
...
There's even more...
http://slides.com/drubb
http://slideshare.net/drubb
By Boris Böhne
Introducing Drupal 8 Routing, Controllers, Menu Items & Access Control, a presentation at Drupal Meetup Stuttgart, 04/02/2015