Почему файлы маршрутизации заполнены символами подчеркивания?

Какова сделка со всеми параметрами с и без, префиксный символ подчеркивания ?

Где Drupal решает, как обрабатывать эти параметры?

Была ли эта концепция введена из Symfony, или это ново для Drupal?

Пример ( node.routing.yml ):

node.overview_types:
  path: '/admin/structure/types'
  defaults:
    _controller: '\Drupal\Core\Entity\Controller\EntityListController::listing'
    entity_type: 'node_type'
    _title: 'Content types'
  requirements:
    _permission: 'administer content types'
23 голоса | спросил Daniel 23 +04002013-10-23T14:04:19+04:00312013bEurope/MoscowWed, 23 Oct 2013 14:04:19 +0400 2013, 14:04:19

1 ответ


40

Вот, надеюсь, хорошее объяснение идеи системы маршрутизации а также специальные дополнения к нему.

Общий обзор

Компоненты Symfony имеют две важные концепции. Ядро http - это система, которая получает запрос, как-то прошу другие системы произвести для определения кусок кода, который создает запрошенный результат (объект ответа) и отправляет ответ клиенту. Этот кусок кода называется контроллером, поэтому это может быть либо чистая php4-подобная функция, либо метод для объекта, либо даже анонимная функция.

Системой, которая знает, какой контроллер отвечает за текущий запрос, является система маршрутизации.

введите описание изображения здесь>> </p>

<h2> Основной файл маршрутизации </h2>

<p> В качестве разработчика модуля вы определяете список маршрутов и соответствующие контроллеры. </p>

<p> Вот пример ответа json: </p>

<pre><code>taxonomy.autocomplete_vid:
  путь: '/taxonomy /autocomplete_vid /{taxonomy_vocabulary}'
  по умолчанию:
    _controller: '\ Drupal \ taxonomy \ Controller \ TermAutocompleteController :: autocompletePerVid'
  требования:
    taxonomy_vocabulary: \ d +
</code></pre>

<p> В большинстве документации по symfony упоминается шаблон, но drupal решил просто разрешить не устаревший «путь» в своем файле маршрутизации. </p>

<p> Ключевой концепцией является контроллер, который получает некоторые параметры из системы
и преобразует их в ответ. В этом примере у вас есть параметр
'Taxonomy_vocabulary. Таким образом, все без подчеркивания считается
быть параметром для контроллера. Если вы хотите указать значение по умолчанию,
вы помещаете его в массив по умолчанию. В том же yml-массиве вы
укажите класс и метод, связанные с '::', чтобы сообщить системе, где искать
. Каждое другое свойство не имеет ничего общего с параметрами контроллера
и поэтому считаются внутренними и поэтому имеют подчеркивание как префикс. </p>

<p> Symfony также позволяет вам определять регулярные выражения для проверки
что входной параметр действителен (используя «требования»). Здесь он будет соответствовать только цифрам. </p>

<h2> Контроллер-преобразователь </h2>

<p> Как только symfony узнает, какой контроллер активен в текущем запросе,
он запрашивает так называемый контроллер-резольвер, чтобы создать экземпляр контроллера,
которые могут быть выполнены через call_user_func_array. У контроллера есть один
метод для вызова контроллера (метод объекта +, анонимная функция)
и один способ получения параметров, переданных контроллеру, см. <a href = Диспетчер контроллера

Расширения Drupal

Это в основном то, что дает вам symfony.

Drupal хотя и немного сложнее:

  • Вы можете проверить доступ к маршруту. Например, вызов user_access () был очень распространен в Drupal 7 и ниже.
  • Вы не хотите преобразовывать taxonomy_vocabulary в свой фактический объект объекта
  • Вы не хотите генерировать полный ответ страницы, а просто «основной контент».

Проверка доступа

Drupal внедрил систему поверх частей symfony, которая проверяет, пользователь имеет доступ к текущему маршруту, а альтернативный вариант - исключение 403 (отказ в доступе). Менеджер доступа

В файле маршрутизации вы указываете это в части требований. Самый распространенный биты перечислены в примере:

taxonomy.autocomplete_vid:
  path: '/taxonomy/autocomplete_vid/{taxonomy_vocabulary}'
  defaults:
    _controller: '\Drupal\taxonomy\Controller\TermAutocompleteController::autocompletePerVid'
  requirements:
    taxonomy_vocabulary: \d+

_permission определяет вызов user_access (), _role гарантирует, что пользователь имеет определенную роль (вы можете указать несколько из них для OR и + для AND и логики). _entity_access запрашивает у системы сущности, есть ли у вас доступ для просмотра пользовательского объекта. По умолчанию drupal гарантирует, что вы добавляете проверки доступа, вы можете продолжить, но вы можете переключать его в параметрах через _access_mode.

Приведение к базовому типу

Как указано в листинге, вы не хотите заботиться о загрузке объекта, см. /user /{user} в качестве примера. Для сущностей вы в основном просто используете имя типа сущности, и оно будет выполнять entity_load с идентификатором, переданным в URL-адресе. Диспетчер преобразователей параметров

Ответ страницы

Как написано до того, как контроллер отвечает за создание объекта ответа. Это было бы ужасно в Drupal, поскольку страница состоит из гораздо большего, чем все блоки, появляющиеся в его регионах, шаблоны html и page и т. Д. Поэтому drupal указал другой ключ, чтобы указать контроллер, который возвращает содержимоестраница:

  path: '/user/{user}'
  options:
    _access_mode: 'ANY'
  requirements:
    _permission: 'access user profiles'
    _entity_access: 'user.view'
    _role: 'administrator'

Определенная строка - это контроллер, используемый для создания массива рендеринга для основной области содержимого вашей страницы.

Другим дополнением является также способ обработки форм, поскольку возвращение страницы с формой немного более сложный, чем просто массив рендеринга, поэтому вы можете определить _form с FormInterface, ответственным за текущую форму.

user.page:
  path: '/user'
  defaults:
    _content: '\Drupal\user\Controller\UserController::userPage'
  requirements:
    _access: 'TRUE'

Примечание. Это касается самых важных моментов с моей точки зрения, хотя наверняка есть еще много вопросов, о которых можно поговорить.

TL; DR

  • Подчеркивания указываются для всех, которые не являются параметрами контроллера. Это происходит как своего рода «стандарт» от symfony.
  • Эти параметры повышаются с помощью param и передается контроллеру с помощью контроллер-преобразователь
  • У Drupal есть некоторые дополнения, которые облегчают взаимодействие людей с системой маршрутизации symfony.
ответил Daniel Wehner 23 +04002013-10-23T15:40:32+04:00312013bEurope/MoscowWed, 23 Oct 2013 15:40:32 +0400 2013, 15:40:32

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132