Ось, сподіваємось, гарне пояснення ідеї системи маршрутизації, а також специфічних доповнень до неї.
Загальний огляд
Компоненти 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.