Пишу код первого модуля Drupal

Хорошо, модуль я сделал, теперь неплохо бы наполнить его полезным кодом, для начала пойдет и Hello World.

На этом этапе столкнулся с тем, что Filezilla не передавал данные на сайт:

Оказалось, что причина в том, что почему то для сайта был выбран тип VMS. Поменял на «автоопределение» и все заработало.

Далее, галочка на моем модуле не ставилась:

Пришлось отключить всё в секции зависимостей:

После этого смог поставить галочку и нажал кнопку «Установить». Модуль включился.

Код пишу согласно мануалов:

  1. https://drupalfly.ru/lesson/create-my-module-for-drupal-8
  2. https://niklan.net/blog/66

Код роутинга 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 не может этим погордиться.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *