Статьи

Сборка модуля Drupal 8: маршрутизация, контроллеры и ссылки меню

Помните, что из-за процесса разработки Drupal 8 на момент написания этой статьи некоторые части кода могли быть устаревшими. Взгляните на этот репозиторий, в котором я пытаюсь обновить пример кода и заставить его работать с последней версией Drupal 8.

Drupal 8 вносит множество изменений, которые стремятся зарегистрировать его в том же клубе, к которому принадлежат другие современные PHP-фреймворки. Это означает, что старое процедурное программирование в стиле PHP 4 в значительной степени заменено объектно-ориентированной архитектурой. Чтобы достичь этого, по инициативе Proudly Found Elsewhere , Drupal 8 включает код, не разработанный специально для Drupal.

Одним из наиболее важных дополнений к Drupal являются компоненты Symfony , что имеет 2 основных значения для разработчиков Drupal. Во-первых, он может значительно увеличить количество разработчиков, которые теперь захотят разработать для Drupal. И, во-вторых, это пугает некоторых из нынешних разработчиков Drupal 7, которые не имеют большого опыта работы с современными PHP-практиками. Но это нормально, мы все учимся, и уроки, извлеченные из таких фреймворков, как Symfony (и, надеюсь, Drupal 8), будут легко расширяемыми и применимыми к другим PHP-фреймворкам.

Тем временем Drupal 8 находится на поздней стадии цикла выпуска, текущая версия на момент написания alpha11 . Мы будем использовать эту версию, чтобы показать некоторые основные изменения в разработке модулей, с которыми сначала столкнутся разработчики Drupal 7, с которыми следует ознакомиться. Я установил репозиторий Git, где вы можете найти код, который я пишу в этой серии, чтобы вы могли следовать так, если хотите.

Как мне создать модуль?

Первое, что мы рассмотрим, — это определение необходимых файлов и структуры папок, чтобы сообщить Drupal 8 о нашем новом модуле. В Drupal 7 нам нужно было создать как минимум 2 файла ( .info и .module ), но в Drupal 8 достаточно первой версии YAML. И да. .info теперь заменены файлами .info.yml и содержат аналогичные данные, но структурированы по-разному.

Еще одно важное изменение заключается в том, что папки пользовательских модулей и модулей contrib теперь попадают прямо в корневую папку modules/ . Это потому, что весь основной код был перемещен в отдельное core/ папку. Конечно, в каталоге modules/ вам рекомендуется разделять модули между custom и contrib, как в Drupal 7.

Давайте продолжим и создадим модуль с именем demo (очень оригинальный) и поместим его в каталог modules/custom/ . И, как я уже говорил, внутри этой вновь созданной папки demo/ все, с чего нам нужно начать, это файл demo.info.yml со следующим необходимым содержимым:

 name: Drupal 8 Demo module description: 'Demo module for Drupal 8 alpha11' type: module core: 8.x 

Три из четырех вы должны быть знакомы (имя, описание и ядро). type теперь также является обязательным, поскольку вы можете иметь yml-файлы для тем. Еще одна важная вещь, которую нужно иметь в виду, это то, что пробелы в файлах yml что-то значат, и для организации данных в структурах, подобных массивам, используется правильный отступ.

Вы можете проверить эту страницу документации для других пар ключ | значение, которые могут быть .info.yml файл модуля .info.yml и к уведомлению об изменении, которое объявило о переходе на этот формат.

И это все, один файл. Теперь вы можете перейти на страницу « Расширить» , найти демо-модуль и включить его.

Как я уже говорил, нам больше не нужно создавать файл .module прежде чем мы сможем включить модуль. С точки зрения архитектуры, файлы .module будут значительно уменьшены в размере из-за того, что большая часть бизнес-логики перейдет на классы обслуживания, контроллеры и плагины, но некоторые из них мы увидим позже.

Что такое «маршрутизация» и что случилось с hook_menu () и его обратными вызовами?

В Drupal 7 hook_menu() был, вероятно, наиболее реализованным хуком, потому что он использовался для определения путей к Drupal и связывания этих путей с функциями обратного вызова. Он также отвечал за создание ссылок на меню и кучу других вещей.

В Drupal 8 нам больше не понадобится hook_menu() , поскольку мы интенсивно используем компоненты Symfony2 для управления маршрутизацией. Это включает в себя определение маршрутов в качестве конфигурации и обработку обратного вызова в контроллере (метод класса Controller ). Давайте посмотрим, как это работает, создав простую страницу, которая выводит классический Hello world! ,

Во-первых, нам нужно создать файл маршрутизации для нашего модуля с именем demo.routing.yml . Этот файл находится в корневой папке модуля (рядом с demo.info.yml ). Внутри этого файла у нас может быть следующее (простое) определение маршрута:

 demo.demo: path: '/demo' defaults: _content: '\Drupal\demo\Controller\DemoController::demo' _title: 'Demo' requirements: _permission: 'access content' по demo.demo: path: '/demo' defaults: _content: '\Drupal\demo\Controller\DemoController::demo' _title: 'Demo' requirements: _permission: 'access content' 

Первая строка отмечает начало нового маршрута с именем demo для модуля demo (первая — это имя модуля, а вторая — имя маршрута). В разделе path мы указываем path , по которому мы хотим зарегистрировать этот маршрут. По defaults у нас есть две вещи: заголовок страницы по умолчанию ( _title ) и _content который ссылается на метод класса DemoController . В соответствии с requirements мы указываем разрешение, которое должен иметь пользователь, который должен иметь доступ для просмотра страницы. Вы должны проконсультироваться на этой странице документации для получения дополнительных возможностей для этого файла маршрутизации.

Теперь давайте создадим наш первый контроллер с именем DemoController который будет DemoController метод с именем demo() , вызываемый при DemoController пользователем этой страницы.

Внутри каталога модуля создайте папку с именем src/ и папку с именем Controller/ внутри нее. Это будет место для хранения классов контроллера. Идем дальше и создаем первый: DemoController.php .

Размещение контроллеров и, как мы увидим, других классов в папке src/ является частью принятия стандарта PSR-4. Изначально нам нужно было создать более крупную структуру папок (стандарт PSR-0), но теперь есть переходный этап, в котором оба будут работать. Так что, если вы все еще видите код, помещенный в папку с именем lib/ , это PSR-0.

Внутри нашего файла DemoController.php мы теперь можем объявить наш класс:

 <?php /** * @file * Contains \Drupal\demo\Controller\DemoController. */ namespace Drupal\demo\Controller; /** * DemoController. */ class DemoController { /** * Generates an example page. */ public function demo() { return array( '#markup' => t('Hello World!'), ); } } 

Это самое простое и минимальное, что нам нужно сделать, чтобы что-то отображалось на странице. В верхней части мы указываем пространство имен класса, а ниже мы объявляем класс.

Внутри класса DemoController у нас есть только метод demo() который возвращает Drupal-подобный отображаемый массив. Ничего большого. Все, что нам нужно сделать, это очистить кеши и перейти по http://example.com/demo и мы должны увидеть страницу Drupal с напечатанным Hello World .

В Drupal 7, когда мы реализуем hook_menu() , мы также можем добавить зарегистрированные пути к меню, чтобы ссылки на меню отображались на сайте. Это снова больше не обрабатывается этим хуком, но мы используем файл yml для объявления ссылок меню как конфигурации.

Давайте посмотрим, как мы можем создать ссылку меню, которая отображается в меню структуры администрации. Для начала нам нужно создать файл с именем demo.menu_links.yml в корне нашего модуля. Внутри этого yml-файла мы определим ссылки меню и их положение в существующих меню на сайте. Чтобы достичь того, что мы намереваемся сделать, нам нужно следующее:

 demo.demo: title: Demo Link description: 'This is a demo link' parent: system.admin_structure route_name: demo.demo 

Опять же, у нас есть структура yml, основанная на отступе, в которой мы сначала определяем имя машины ссылки меню ( demo ) для demo модуля (как мы сделали с маршрутизацией). Далее у нас есть заголовок и описание ссылки, за которыми следует родитель этой ссылки (где она должна быть размещена) и какой маршрут он должен использовать.

Значением parent является ссылка на родительское меню (добавляемая его модулем), и чтобы найти ее, вам нужно немного *.menu_links.yml файлах *.menu_links.yml . Я знаю, что ссылка Structure определена в основном модуле System, поэтому, посмотрев в файл system.menu_links.yml я смог определить имя этой ссылки.

route_name — это имя компьютера маршрута, который мы хотим использовать для этой ссылки. Мы определили наши ранее. И с этим на месте, вы можете очистить кеш и перейти по http://example.com/admin/structure где вы должны увидеть совершенно новую ссылку меню с правильным заголовком и описанием и ссылкой на demo/ путь. Неплохо.

Вывод

В этой статье мы начали исследовать разработку модулей в Drupal 8. На этом этапе (выпуск alpha11) пришло время начать изучать, как работать с новыми API и модулями Contribute портов. С этой целью я пишу свое исследование этой новой и интересной среды, которая будет представлять собой Drupal 8, чтобы мы все могли изучить изменения и приступить к работе, когда придет день релиза.

Для начала мы рассмотрели некоторые основы: как запустить модуль Drupal 8 (файлы, структура папок и т. Д.), Все по сравнению с Drupal 7. Мы также увидели, как определять маршруты и класс Controller с помощью метода, вызываемого этот маршрут. И, наконец, мы увидели, как создать ссылку меню, которая использует маршрут, который мы определили.

В следующем уроке мы продолжим создание этого модуля и рассмотрим некоторые другие интересные новинки, с которыми работает Drupal 8. Мы увидим, как мы можем создавать блоки и как работать с формами и системой конфигурации. Увидимся тогда.