Можно ли ограничивать маршрут Symfony 2 только для запросов XHR? Я хочу объявить маршруты, которые доступны только через AJAX.
Я не хочу помещать некоторые дополнительные строки в каждое действие, подобное конкретному AJAX:
if ($request->isXmlHttpRequest()) { // do something } else { // do something else }
Я хочу определить:
чтобы обойти условия, подобные описанным выше.
Я знаю, что этот вопрос немного старше, но между тем в Symfony 2.4 появился новый способ добиться этого.
Полностью настраиваемый маршрут, соответствующий условиям
Для ограничения ajax это будет выглядеть так:
contact: path: /contact defaults: { _controller: AcmeDemoBundle:Main:contact } condition: "request.isXmlHttpRequest()"
Также возможно в аннотации:
/** * ContactAction * * @Route("/contact", name="contact", condition="request.isXmlHttpRequest()") */
Мой совет будет заключаться в том, чтобы определить вашу собственную службу маршрутизатора вместо значения по умолчанию , которая будет распространяться на Symfony\Bundle\FrameworkBundle\Routing\Router
и переопределить метод resolveParameters () с использованием вашей собственной логики для обработки дополнительных требований.
И тогда вы можете сделать что-то подобное в своей маршрутизации:
your_route: pattern: /somepattern defaults: { somedefaults } requirements: _request_type: some_requirement
Я не уверен, что вы можете предотвратить запрос, однако вы можете проверить запрос XHR в Контроллере, проверив текущий запрос
Код будет выглядеть так:
if ($request->isXmlHttpRequest()) { // ... }
Это не на 100% надежнее, из-за, среди прочего, несогласованности браузера и возможности вмешательства с помощью прокси. Однако это преобладающий метод проверки асинхронного запроса и рекомендуется многими. Если вы cr
URL-адрес
Альтернативой может быть добавление параметра в ваш URL для идентификации запроса как асинхронного. Это достигается путем добавления ?ajax=1
к вашему URL-адресу. Затем проверьте параметр:
$AjaxRequest = $request->getParameter('ajax'); If($AjaxRequest == 1) { //... }
Конечно, на этом этапе вы также можете создать определенный маршрут, например /ajax/index/
.
Нет, ты не можешь. Это не зависит от того, какую структуру вы используете, запросы AJAX в основном – это просто запросы к серверу. Нет надежного решения на 100%, просто «хаки».
То, что вы ищете, не существует в конфигурации маршрутизации Symfony.
Request :: isXmlHttpRequest даже не на 100% надежнее и проверяет HTTP-заголовки, помещенные вашей библиотекой JavaScript:
Он работает, если в вашей библиотеке JavaScript установлен HTTP-заголовок X-Requested-With. Известно, что он работает с Prototype, Mootools, jQuery.
Вы можете использовать требования для достижения описанного результата.
Итак, предположим, что вы определяете маршруты в yml-формате, вам нужно сделать что-то вроде этого
my_route: pattern: /path/to/route defaults: { _controller: CompanyBundle:Controller:Action, _format: html } requirements: _format: xmlhttp /* not sure about the correct format because i've never checked about */
И вы можете, конечно, использовать _method: POST
или _method: GET