Роутинг и контроллеры в Drupal 8

Оригинал статьи: https://lakshminp.com/routing-and-controllers-drupal-8

Подробнее про роуты, контроллеры и ограничение доступа: http://atendesigngroup.com/blog/restricting-access-drupal-8-controllers

Система роутинга 8-й версии Друпал полностью переписана и кардинально отличается от ее предыдущей версии Drupal 7, представляемой с помощью hook_menu. Роут Drupal это URL адрес для вывода определенного контента. Этот вывод обычно определяется методом контроллера, который возвращает рендер массив(массив подлежащий визуализации).

Система роутинга создается симфони модулем HTTP Kernel, к которому мы обратимся далее.

Давайте создадим новый роут.

Во первых создаем модуль для хранения всего кода. Вы можете скопировать код с репозитория:

$ git clone https://github.com/drupal8book/myroute.git
$ cd myroute
$ git checkout -f simple-route

или сгенерировать код с помощью консоли Drupal:

$ drupal generate:module

Enter the new module name:
> myroute

Enter the module machine name [myroute]:
>

Enter the module Path [/modules/custom]:
>

Enter module description [My Awesome Module]:
> Routing and controllers

Enter package name [Custom]:
> D8MD

Enter Drupal Core version [8.x]:
>

Do you want to generate a .module file (yes/no) [yes]:
> no

Define module as feature (yes/no) [no]:
>

Do you want to add a composer.json file to your module (yes/no) [yes]:
> no

Would you like to add module dependencies (yes/no) [no]:
>

Do you confirm generation? (yes/no) [yes]:
>

Generated or updated files
Site path: /var/www/html
1 - modules/custom/myroute/myroute.info.yml

Давайте напишем простой контроллер, который выводит "привет мир", когда мы перейдем по адресу /helloworld. C помощью консоли вводим:

$ drupal generate:controller

Enter the module name [email_management]:
> myroute

Enter the Controller class name [DefaultController]:
> HelloWorldController

Enter the Controller method title (to stop adding more methods, leave this empty) [ ]:
> Hello World

Enter the action method name [hello]:
>

Enter the route path [/myroute/helloworld/{name}]:
> helloworld

Enter the Controller method title (to stop adding more methods, leave this empty) [ ]:
>

Do you want to generate a unit test class (yes/no) [yes]:
> no

Do you want to load services from the container (yes/no) [no]:
> no

Do you confirm generation? (yes/no) [yes]:
>

Generated or updated files
Site path: /var/www/html
1 - modules/custom/myroute/src/Controller/HelloWorldController.php
2 - modules/custom/myroute/myroute.routing.yml
// router:rebuild

Rebuilding routes, wait a moment please

[OK] Done rebuilding route(s).

Теперь включим модуль с помощью drush:

$ drush en myroute -y

Откроем файл контроллера modules/custom/myroute/src/Controller/HelloWorldController.php и изменим вывод разметки

<?php
public function hello() {
  return [
   
'#type' => 'markup',
   
'#markup' => $this->t('Hello World')
  ];
}
?>

Очистим кеш:

$ drush cr

Перейдем по адресу /helloworld

Эквивалентом этому на Drupal 7 был следующий код:

<?php
// inside myroute.module...

function myroute_menu() {
 
$items = array();
 
$items['main'] = array(
   
'title' => Hello World',
    '
page callback' => myroute_hello',
   
'access arguments' => array('access content'),
   
'type' => MENU_NORMAL_ITEM,
   
'file' => 'myroute.pages.inc'
 
);
  return
$items;
}

// inside myroute.pages.inc

function myroute_hello() {
  return
t(‘Hello World’);
}
?>

Share this post

Leave a comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • To post pieces of code, surround them with <code>...</code> tags. For PHP code, you can use <?php ... ?>, which will also colour it based on syntax.
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.