Routing Flashcards
Как следует обрабатывать параметры запроса? (Request) Можно ли
использовать $_GET, $_POST? Если да, то в каких случаях?
- Запросы представлены классом Request, параметры могут быть получены через паблик свойства класса:
request — эквивалент $_POST;
query — эквивалент $_GET ($request->query->get(‘name’));
cookies — эквивалент $_COOKIE;
attributes — эквивалента нет, используется для хранения дополнительных данных;
files — эквивалент $_FILES;
server — эквивалент $_SERVER;
headers — в основном эквивалент подгруппе $_SERVER ($request->headers->get(‘User-Agent’)). - На ранних этапах загрузки, когда Request недоступен, можно использовать $_GET, $_POST.
Как создать новый роут?
В корне директории модуля создается файл module_name.routing.yml, в котором описывается имя роута, path(путь), обработчик(метод контроллера или формы), права доступа.
a. Как можно определить формат получаемых или возвращаемых данных?
Получаемых:
атрибут роута _format
Возвращаемых: в контроллере: return new JsonResponse(array()); BinaryFileResponse RedirectResponse Response(HTTP) StreamedResponse
b. Каким образом можно создать динамический путь?
В MODULE.routing.yml объявляем элемент route_callbacks.В элементе route_callbacks определяется callback для генерации маршрутов. Им может быть как метод класса (\Drupal\example\Routing\ExampleRoutes::routes), так и метод сервиса (example.service:routes).
Метод генерации роутов должен возвращать массив объектов класса \Symfony\Component\Routing\Route либо объект класса \Symfony\Component\Routing\RouteCollection.
c. Каким образом можно вывести форму в кастомном пути? А сущность?
форма: параметр _form, который указывает на класс формы
Сущность:
_entity_view: entity_type.view_mode
_entity_list: entity_type
d. Каким образом можно передать информацию или объекты через параметры?
В routing.yml:
path: /{argument} - для информации и объектов
Соответственно в методе контроллера роута нужно будет описать параметр $argument.
i. Как нужно объявлять роут, если в должно присутствовать несколько параметров-нод (node)?
для нескольких: path: '.../{node_1}/{node_2}' options: parameters: node_1: type: entity.node node_2: type: entity.node
в контроллере: function callback
e. Каким образом можно настроить доступ для пути? (несколько способов)
Роль пользователя (_role) – можно указывать, как одну роль, так и комбинации AND/OR посредством символов “,”/”+” соответственно;
Наличие разрешения (_permission) – аналогично роли можно указывать одиночное разрешение или комбинацию;
Наличие разрешения выполнения операции для сущности (_entity_access) – например, node.view выполняет проверку на наличие прав на просмотр ноды;
Кастомный callback управления доступом роута (_custom_access) – подробно можно прочитать в официальной документации;
На основе типа HTTP-запроса (_method) – множество типов указывается с помощью соответствующего символа - “|”.
f. Каким образом можно настроить HTTP-методы, форматы данных или http/https?
Методы:
_method: ‘GET|POST’
Форматы данных:
_content_type_format: json
- Каким образом можно изменить уже существующий путь?
Создается класс, наследующий RouteSubscriberBase, в котором реализуется метод alterRoutes. Изменять созданные роуты можно путём манипуляций с объектом RouteCollection. После создания класс регистрируется как сервис.
- Каким образом можно программно вернуть ошибку (например, 404)?
throw new NotFoundHttpException();