При создании различных страниц разработчики часто должны генерировать ссылки, 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()в вашем контроллере.
