Как написать модуль на Drupal 8. Азы.

В Drupal 8 больше не будет инициализации модуля через *.info. На смену ему пришёл Symfony YAML (.yml). И выглядеть это будет: *.info.yml
Так вот, создаём в папке modules/my_module, где my_module - название вашего модуля, два файла. Один - my_module.module будет пустым, а второй файл my_module.info.yml будет со следующим содержимым:

name: My module
type: module
description: 'This is my module for Drupal 8.'
package: Custom
version: 8.x-1.0
core: 8.x
dependencies:
  - node
  - block
hidden: false

Более подробно читаем тут.

Дальше будет немного сложнее. Так как Drupal перешёл на MVC (Model-View-Controller), то нам нужно создать теперь Controller. Создаём файл в modules/my_module/lib/Drupal/my_module/Controller/MyModuleController.php со следующим содержимым:

namespace Drupal\my_module\Controller;
 
use Drupal\Core\Controller\ControllerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
 
class MyModuleController implements ControllerInterface {
 
  public static function create(ContainerInterface $container) {
    return new static($container->get('module_handler'));
  }
 
  public function my_modulePage() {
    return array(
      '#markup' => t('This is the demo page.'),
    );
  }
}

Дальше создаём modules/my_module/my_module.routing.yml:

my_module:
  pattern: 'admin/my_module'
  defaults:
    _content: '\Drupal\my_module\Controller\MyModuleController::my_modulePage'
  requirements:
    _permission: 'access administration pages'

Ну а теперь воспользуемся hook_menu() и зарегистрируем путь для нашего модуля в файле my_module.module.

/**
 * Implements hook_menu().
 */
function my_module_menu() {
  $items['admin/my_module'] = array(
    'title' => 'My first Module',
    'description' => 'This is the demo page.',
    'route_name' => 'my_module',
  );
  return $items;
}

И после включения модуля вы должны увидеть новый пункт меню My module в админке.