При создании различных страниц разработчики часто должны генерировать ссылки, 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\Ur
l для генерации URL.drupal_goto()
больше нет. ИспользуйтеRedirectResponse
, или методredirect()
в вашем контроллере.