Разработка

Генерация URL и перенаправлений в Drupal 8

Drupal
Генерация URL и перенаправлений

При создании различных страниц разработчики часто должны генерировать ссылки, URL и перенаправлять пользователей либо туда, откуда они пришли, либо на любую другую страницу. В Drupal 7 использовали l(), drupal_get_destination() и drupal_goto(). В Drupal 8 всё сильно изменилось. И хотя метод drupal_get_destination() всё ещё на месте, он отмечен как устаревший, так что его лучше не использовать.

Генерация URL

При добавлении URL в строку, например, в текстовом описании, рекомендуется использовать класс \Drupal\Core\Url. Вот некоторые полезные методы:

  • внутренний URL, основанный на роутинге - Url::fromRoute(), например: Url::fromRoute('acquia_connector.settings');
  • внутренний URL, основанный на пути - Url::fromInternalUri(), например: Url::fromInternalUri('node/add');
  • внешний URL - Url::fromUri, например: Url::fromUri('https://www.acquia.com').

Последние два метода очень похожи. Основное отличие в том, что fromInternalUri() предполагает префикс типа 'internal:', который сообщает Drupal о том, что необходимо построить внутренний путь. Здесь можно узнать больше о поддерживаемых префиксах.

Когда необходимо сократить и отобразить ссылку в виде текста, вы можете использовать метод toString():

Url::fromRoute('acquia_connector.settings')->toString()

Перенаправление - drupal_goto в Drupal 8

Когда-то всё было просто. Хлеб был дешевле. Drupal было процедурным и разработчики использовали drupal_goto(). Но времена меняются. Теперь Drupal объектно-ориентированным и генерация ответа стала более регулируемой, чем раньше.

Для перенаправления пользователя drupal_goto() обычно располагали в функциях обратного вызова страницы, но они в прошлом, на их место пришли контроллеры. Типичный роут ответит классом контроллера, который расширяет ControllerBase, и является ответственным за доставку правильного ответа в браузер. Для вызова перенаправления мы просто должны вернуть правильный ответ. Всё это делается с помощью класса RedirectResponse (вотчина Symfony):

use Drupal\Core\Url; 
... 
return new RedirectResponse(Url::fromUri('/node/addp'));

В Drupal 8 класс ControllerBase (через трейт UrlGeneratorTrait) раскрывает метод redirect(), который предоставляет нам полезное сокращение. Если вы перенаправляете на внутренний роут, вы можете реализовать то же самое перенаправление через

return $this->redirect('acquia_connector.settings');

Итог - tl;dr

  • l() больше нет. Используйте \Drupal\Core\Link для ссылок и \Drupal\Core\Url для генерации URL.
  • drupal_goto() больше нет. Используйте RedirectResponse, или метод redirect() в вашем контроллере.
Оригинальная статья:
Dmitry Rekun
Работаю в банковской сфере, а с веб-разработкой (непосредственно с Joomla) столкнулся в 2007 году. Теперь это моё хобби и время от времени вторая работа. Какое-то время вёл свой блог, но решил попробовать работать в команде. И вот c 2012 года я здесь :)