Custom module development in Drupal 8

(@mbovan)

Miloš Bovan

  • Drupal.org (@mbovan)
  • Drupal 8 Developer

Overview

  • Create a simple module
  • Skeleton
  • Routes and controllers
  • Menu items, local tasks, local actions
  • Custom permissions
  • Services
  • Plugin API
  • Blocks

How to create a module?

  • demo.info.yml
name: Drupal 8 Demo
description: 'Drupal 8 demo module'
type: module
core: 8.x
name: Drupal 8 Demo
description: 'Drupal 8 demo module'
type: module
core: 8.x

dependencies:
  - node
test_dependencies:
  - test_module

configure: configure.route
  • composer.json
{
    "name": "drupal/demo",
    "description": "This is an example composer.json for demo module.",
    "type": "drupal-module",
    "license": "GPL-2.0+"
}

How to create a module?

Directory structure

Routing

  • Symfony2's HttpKernel, HttpFoundation, and related libraries
  • \Drupal::request()

Routing

Drupal 8 Docs

  • demo.routing.yml

Routing

demo.route:
  path: '/demo'
  defaults:
    _controller: '\Drupal\demo\Controller\DemoController::demo'
    _title: 'Demo'
  requirements:
    _permission: 'access content'
demo.route:
  path: '/demo'
  defaults:
    _controller: '\Drupal\demo\Controller\DemoController::demo'
    _title: 'Demo'
  requirements:
    _permission: 'access content'

demo.param:
  path: '/admin/content/demo/{node}'
  defaults:
    _controller: '\Drupal\demo\Controller\DemoController::param'
    _title: 'Demo'
  requirements:
    _permission: 'access content'
  • src/Controller/DemoController.php

Routing

<?php

namespace Drupal\demo\Controller;

class DemoController {

  public function demo() {
    return ['#markup' => t('Demo')];
  }

}
<?php

namespace Drupal\demo\Controller;
use Drupal\node\NodeInterface;

class DemoController {

  public function demo() {
    return ['#markup' => t('Demo')];
  }

  public function param(NodeInterface $node) {
    return ['#markup' => $node->label()];
  }

}

Menu links

  • demo.links.menu.yml
demo.route:
  title: 'Demo menu item'
  parent: system.admin_structure
  description: 'Provides a link to the demo route.'
  route_name: demo.route

Local tasks

  • demo.links.task.yml
demo.task:
  title: Demo task
  route_name: demo.route
  base_route: system.admin_content

Local actions

  • demo.links.action.yml
demo.action:
  route_name: demo.route
  title: Add demo item
  appears_on:
    - system.admin_content

Custom permissions

  • demo.permissions.yml
administer demo:
  title: Administer Demo

Services

  • demo.services.yml
services:
  demo.service:
    class: Drupal\demo\DemoService
services:
  demo.service:
    class: Drupal\demo\DemoService
    arguments: ['@entity_type.manager']

Custom blocks

  • Rely on Plugin API
  • src/Plugin/Block/DemoBlock.php
<?php

namespace Drupal\demo\Plugin\Block;

use Drupal\Core\Block\BlockBase;

/**
 * Demo block.
 *
 * @Block(
 *   id = "demo_block",
 *   admin_label = @Translation("Demo block"),
 * )
 */
class DemoBlock extends BlockBase {
  
  public function build() {
    return ['#markup' => $this->t('Demo block')];
  }
}

Summary

  • Built a simple module
  • Routes handling
  • Code samples (items, permissions, blocks...)
  • bit.ly/d8-demo (Demo module Github repository)

  • bit.ly/d8-demo-slides (Slides)

  • drupal.org/docs/8

  • api.drupal.org/api/drupal/8

RESOURCES

Thank you!

Questions

& ANSWERS

@mbovan

Custom module development in Drupal 8

By mbovan

Custom module development in Drupal 8

  • 652