Drupal 8: Создание пункта меню с применением drupal routing system

Аватар пользователя Олег

В Drupal 8 внесено множество изменений основным направлением которых есть применение Symphony 2 как базового фреймворка
В этой серии статей будет движение от простого к сложному.  Итак начнем с создания простого модуля , пункта меню и страницы к нему.
И так начнем.
Первое что необходимо сделать - сосздать кастом модуль.
В Drupal 8 изменилось правильное расположение custom модулей если в Drupal 7 кастом модули надо было располагать /sites/all/modules/ то в Drupal 8 ядро перенесли в папку core и теперь кастомный модули необходимо располагать в /modules/ для разделения кастом и контриб модулей внутри папки /modules принять создавать папку /modules/contrib для контриб модулей и /modules/custom для кастом
Кроме того в drupal 8 поменялся формат info файла модуля

Создаем папку модуля


mkdir -p modules/custom/mymodule

Заходим в нее и создаем info файл модуля

d7 вариант (название файла mymodule.info)

name = mymodule
description = mymodule module description
package = custom
core = 7.x

d8 вариант (название файла mymodule.info.yml)

name: mymodule
type: module
description: "MyModule description."
package: Custom
version: 1.0
core: 8.x
tags:
- custom
- dev
hidden: false

Создаем файл mymodule.module с следующим содержимым

function cp_menu() {
$items['cp/domains'] = array(
'title' => t('Domains'),
'type' => MENU_CALLBACK,
'route_name' => 'cp_domains',
'access arguments' => array('use panel'),
);
return $items;
}

function cp_permission() {
$permissions = array(
'use panel' => array(
'title' => t('Useing panel'),
'description' => t('Useing hosting control panel.'),
),
);
return $permissions;
}
создаем mymodule.routing.yml со следующим содержимым

cp_domains:
pattern: '/cp/domains'
defaults:
_content: '\Drupal\cp\Controller\CpController::domains'
requirements:
_permission: 'use panel'

находясь в папке модуля делаем папку для контроллера и переходим в нее

mkdir -p lib/Drupal/cp/Controller
cd lib/Drupal/cp/Controller

создаем файл mymoduleController.php с классом контроллера

/**
* @file
* Contains \Drupal\thrones\ThronesController.
*/

namespace Drupal\cp\Controller;

use Symfony\Component\DependencyInjection\ContainerAware;

class CpController extends ContainerAware {
public function domains() {
return 'Game of thrones is soo awesome!';
}
}