Symfony2, проверьте, вызвано ли действие ajax или нет
Мне нужно, чтобы каждое действие в моем контроллере проверяло, вызваны ли эти действия с помощью запроса ajax или нет.
Если да, ничего не добавляется, если нет, мне нужно перенаправить на домашнюю страницу.
Я только что нашел if($this->getRequest()->isXmlHttpRequest())
, но мне нужно добавить эту проверку для каждого действия.
Знаете ли вы лучший способ?
Ответы
Ответ 1
Это очень просто!
Просто добавьте переменную $request к вашему методу в качестве использования. (Для каждого контроллера)
<?php
namespace YOUR\Bundle\Namespace
use Symfony\Component\HttpFoundation\Request;
class SliderController extends Controller
{
public function someAction(Request $request)
{
if($request->isXmlHttpRequest()) {
// Do something...
} else {
return $this->redirect($this->generateUrl('your_route'));
}
}
}
Если вы хотите сделать это автоматически, вам нужно определить прослушиватель запросов ядра.
Ответ 2
Для метода многократного использования я использую следующее из базового шаблона
{# app/Resources/views/layout.html.twig #}
{% extends app.request.xmlHttpRequest
? '::ajax-layout.html.twig'
: '::full-layout.html.twig' %}
Таким образом, все ваши шаблоны, расширяющие layout.html.twig
, автоматически могут быть удалены из вашей стандартной разметки, когда они возникли из Ajax.
Источник
Ответ 3
Прежде всего, обратите внимание, что getRequest() устарел, поэтому получите запрос через аргумент в ваших методах действий.
Если вы не хотите публиковать свой класс контроллера с дополнительным кодом, решение должно написать прослушиватель событий, который является службой.
Вы можете определить его следующим образом:
services:
acme.request.listener:
class: Acme\Bundle\NewBundle\EventListener\RequestListener
arguments: [@request_stack]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onRequestAction }
Затем в классе RequestListener создайте метод onRequestAction() и добавьте пакет запросов через constrcutor. Внутри onRequestAction() вы можете получить имя контроллера следующим образом:
$this->requestStack->getCurrentRequest()->get('_controller');
Он вернет имя контроллера и действие (я думаю, что они разделены:). Разберите строку и проверьте правильность контроллера. И если это так, проверьте также, что XmlHttpRequest:
$this->requestStack->getCurrentRequest()->isXmlHttpRequest();
Если это не так, вы можете перенаправить/переслать.
Также обратите внимание, что это будет проверяться при каждом отдельном запросе. Если вы проверите эти вещи прямо на одном из ваших контроллеров, у вас будет более легкое решение.