Чому файли маршрутизації заповнені підкресленнями?


24

Яка угода з усіма параметрами з попередньо встановленим символом підкреслення ?

Де 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'

2
Це умова Symfony . Там хороша стаття тут , знайти біт , який говорить Кінцеве річ звернути увагу на спеціальне значення символу підкреслення в іменах параметрів. Параметри, які починаються з цього символу, мають особливе значення
Клайв

1
Дякую Клайву. У цій статті згадується "особливий сенс", але це зовсім не пояснюється. Чому параметри, що не підкреслюють, також не можуть бути спеціальними?
Даніель

1
хаха, чому параметри, що не підкреслюють, також не можуть бути спеціальними? , це звучить як глибоко екзистенційне питання! Зазвичай (як правило) змінні префіксів робляться або для вказівки на "приватний" var (навряд чи тут), або для уникнення імен зіткнення з іншими класами / методами / чимось іншим у системі. Було б добре побачити офіційні документи, так
Клайв

Відповіді:


41

Ось, сподіваємось, гарне пояснення ідеї системи маршрутизації, а також специфічних доповнень до неї.

Загальний огляд

Компоненти Symfony мають тут два важливі поняття. Ядро http - це система, яка отримує запит, якимось чином вимагає від інших систем виробляти, щоб визначити фрагмент коду, який виробляє запитуваний вихід (об'єкт відповіді) і відправити відповідь назад клієнту. Цей фрагмент коду називається контролером, тому це може бути чиста функція типу php4, метод на об'єкті, або навіть анонімна функція.

Система, яка знає, який контролер відповідає за поточний запит, - це система маршрутизації.

введіть тут опис зображення

Основний файл маршрутизації

Як розробник модуля ви визначаєте список маршрутів та відповідні контролери.

Ось приклад відповіді json:

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

Більшість документацій на symfony згадує шаблон, але drupal вирішив просто дозволити непридатний ключ "шлях" у своєму файлі маршрутизації.

Ключова концепція - це контролер, який отримує деякі параметри від системи та перетворює їх у відповідь. У цьому прикладі у вас є параметр "таксономія_вокабуляр". Отже, все без підкреслення вважається параметром для контролера. Якщо ви хочете вказати значення за замовчуванням, ви ставите його в масив за замовчуванням. У цьому ж масиві yml ви вказуєте клас та метод, пов'язані з '::', щоб сказати системі, де шукати речі. Кожна інша властивість не має нічого спільного з параметрами контролера, тому вважається внутрішньою і тому має підкреслення як префікс.

Сам Symfony також дозволяє визначати регулярні вирази, щоб перевірити, чи є вхідний параметр дійсним (використовуючи "вимоги"). Тут воно відповідало б лише цифрам.

Роздільна здатність контролера

Після того, як symfony дізнався, який контролер активний у поточному запиті, він просить так званий резолютор контролера створити екземпляр контролера, який може бути виконаний за допомогою call_user_func_array. Розпізнавач контролер має один метод , щоб отримати Callable контролера (об'єкт + метод, анонімні функції) і один метод , щоб отримати параметри , що передаються до контролера, см Контролер распознаватель

Drupal розширення

Це в основному те, що дає вам симфонія.

Drupal хоча трохи складніше:

  • Ви можете перевірити доступ до маршруту. Наприклад, виклик user_access () був дуже поширеним в Drupal 7 і нижче.
  • Ви не хочете конвертувати таксономію_вокабуляр в його фактичний об'єкт сутності
  • Ви не хочете генерувати повну відповідь сторінки, а лише "основний контент".

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

Drupal запровадив систему над частинами сімфоні, яка перевіряє, чи має користувач доступ до поточного маршруту, і альтернативне викид 403 (доступ заборонено). Менеджер доступу

У файлі маршрутизації ви вказуєте це в частині вимог. Найбільш поширені біти наведені в прикладі:

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

_permission визначає виклик user_access (), _role гарантує, що користувач має певну роль (ви можете вказати декілька з допомогою логіки ІЛИ та + для І). _entity_access запитує систему системи, чи маєте ви доступ для перегляду сутності користувача. За замовчуванням drupal гарантує, що додані шашки доступу дозволяють вам продовжувати, але ви можете перемикати його у параметрах через _access_mode.

Оновлення

Як зазначено у лістингу, ви не хочете піклуватися про завантаження об'єкта, див. / User / {user} як приклад. Для юридичних осіб ви в основному просто використовуєте назву типу сутності, і вона виконає сутність_завантаження з ідентифікатором, переданим в URL-адресі. Менеджер конвертерів Param

Відповідь сторінки

Як написано перед контролером, відповідальним за генерування об'єкта відповіді. У Drupal це було б жахливо, оскільки сторінка складається з набагато більше схожих на всі блоки, що з’являються в її регіонах, HTML-шаблони та шаблони сторінок і т.д.

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

Визначена рядок - це контролер, який використовується для створення масиву візуалізації для області основного вмісту вашої сторінки.

Іншим доповненням є також спосіб поводження з формами, оскільки повернення сторінки з формою трохи складніше, ніж просто масив візуалізації, тому ви можете визначити _form за допомогою FormInterface, відповідального за поточну форму.

user.pass:
  path: '/user/password'
  defaults:
    _form: '\Drupal\user\Form\UserPasswordForm'
  requirements:
    _access: 'TRUE'

Примітка. Це охоплює найважливіші мої точки зору, хоча можна сказати ще багато питань.

TL; DR

  • Підкреслення задаються для всіх, що не є параметрами для контролера. Це виходить як свого роду "стандарт" від symfony.
  • Ці параметри збільшуються за допомогою перетворювача пара і передаються до контролера за допомогою контролера
  • Drupal має деякі доповнення, щоб полегшити взаємодію людей із системою маршрутизації Symfony.

Ого. Вражаюча відповідь. Чому певні параметри мають періоди в них на противагу використанню підкреслення? Наприклад user.pass(в наведеному вище прикладі) , по порівнянні з user_pass. Це теж умовна умова?
chrisjlee

2
Існує певна умова використовувати модуль $. $ Name як ім'я машини маршруту. Ніщо не передбачає цього всередині.
Даніель Венер

Згідно з наведеною нижче проблемою, _content більше не використовується, але _controller є. Тож приклад у частині « Відповідь сторінки» не є актуальним. drupal.org/node/2378809 Якщо ми хочемо відобразити дані в області вмісту нашої сторінки, то контролер визначить масив візуалізації, аналогічно тому, як це робиться в Drupal 7. Якщо ми хочемо обійти це, і створимо нашу сторінку з нуля, тоді ми можемо повернути об’єкт Response.
benelori

Звичайно, ви не можете розраховувати, що 1,5 року не відбудеться
Даніель Венер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.