Drupal 8: Routing & more

Routing, Controllers, Menu Items, Access Control
Drupal Meetup Stuttgart

04/02/2015

 

1. Once upon a time,
in Drupal 7...

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?

2. D8: Routing & Controllers

~ 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

3. D8: Menu items

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

4. D8: access control

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...

Thank You!

 

http://slides.com/drubb

http://slideshare.net/drubb

Drupal 8: Routing & more

By Boris Böhne

Drupal 8: Routing & more

Introducing Drupal 8 Routing, Controllers, Menu Items & Access Control, a presentation at Drupal Meetup Stuttgart, 04/02/2015

  • 1,307