Пишу код первого модуля Drupal
Хорошо, модуль я сделал, теперь неплохо бы наполнить его полезным кодом, для начала пойдет и Hello World.
На этом этапе столкнулся с тем, что Filezilla не передавал данные на сайт:
Оказалось, что причина в том, что почему то для сайта был выбран тип VMS. Поменял на «автоопределение» и все заработало.
Далее, галочка на моем модуле не ставилась:
Пришлось отключить всё в секции зависимостей:
После этого смог поставить галочку и нажал кнопку «Установить». Модуль включился.
Код пишу согласно мануалов:
Код роутинга zohobooks.routing.yml:
# Первым делом объявляется машинное имя роута. Оно составляется из:
# название_модуля.машинное_название_роута.
zohobooks.mainpage:
# Указываем путь роута, с лидирующим слешем.
path: '/zohobooks'
# Значения по умолчанию
defaults:
# Функция контроллера отвечающая за содержимое.
_controller: '\Drupal\zohobooks\Controller\ZohoBooksController::myPage'
# В данном разделе указываются необходимые требования для роута.
requirements:
# Мы будем показывать страницу только тем, у кого есть права на просмотр
# содержимого.
_permission: 'access content'
Код контроллера ZohobooksController.php по выводу Hello World:
<?php /** * @file * Contains \Drupal\helloworld\Controller\HelloWorldController. * ^ Пишется по следующему типу: * - \Drupal - это указывает что данный файл относится к ядру Drupal, ведь * теперь там еще есть Symfony. * - helloworld - название модуля. * - Controller - тип файла. Папка src опускается всегда. * - HelloWorldController - название нашего класса. */ /** * Пространство имен нашего контроллера. Обратите внимание что оно схоже с тем * что описано выше, только опускается название нашего класса. */ namespace Drupal\zohobooks\Controller; /** * Используем друпальный класс ControllerBase. Мы будем от него наследоваться, * а он за нас сделает все обязательные вещи которые присущи всем контроллерам. */ use Drupal\Core\Controller\ControllerBase; /** * Объявляем наш класс-контроллер. */ class ZohoBooksController extends ControllerBase { /** * {@inheritdoc} * * В Drupal 8 очень многое строится на renderable arrays и при отдаче * из данной функции содержимого для страницы, мы также должны вернуть * массив который спокойно пройдет через drupal_render(). */ public function myPage() { $output = array(); $output['#title'] = 'HelloWorld page title'; $output['#markup'] = 'Hello World!'; return $output; } }
Казалось бы, можно запускать. Однако захожу по адресу /zohobooks от корня сайта и вижу, что страница не найдена. Погуглил, пишут, что нужно обновить кэш admin/config/development/performance:
Но ожидаемое сообщение, что кэш очищен не выходит. Вместо него сообщение, что произошла какая-то ошибка. Тут моих познаний не хватило и пришлось обратиться к администратору сайта.
Тот показал, что ошибки можно посмотреть в журнале: admin/reports/dblog
Там я и увидел замечательную ошибку:
Текстом: ReflectionException: Class «Drupal\zohobooks\Controller\ZohoBooksController» does not exist in ReflectionMethod->__construct() (line 135 of /var/www/myfirm/data/www/zohobooks.myfirm.com/web/core/lib/Drupal/Core/Entity/EntityResolverManager.php).
Я поискал ошибку поиском, оказывается не я первый ухожу с неё гуглить. Точного решения не нашел, но методом проб и ошибок, обнаружил, что имя файла класса у меня не совпадало с именем класса, выглядело так:
Поправил имя файла на ZohoBooksController.php, после этого кэш обновился без ошибок и страница успешно отработала свой код:
Кстати, мне подсказали, что описание классов находится тут: https://www.drupal.org/node/608152. Но я бы променял тысячи страниц документации на качественную расшифровку ошибок. Жаль, что Drupal не может этим погордиться.
Свежие комментарии