Подтвердить что ты не робот

Symfony2, проверьте, вызвано ли действие ajax или нет

Мне нужно, чтобы каждое действие в моем контроллере проверяло, вызваны ли эти действия с помощью запроса ajax или нет.

Если да, ничего не добавляется, если нет, мне нужно перенаправить на домашнюю страницу.

Я только что нашел if($this->getRequest()->isXmlHttpRequest()), но мне нужно добавить эту проверку для каждого действия.

Знаете ли вы лучший способ?

4b9b3361

Ответ 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();

Если это не так, вы можете перенаправить/переслать.

Также обратите внимание, что это будет проверяться при каждом отдельном запросе. Если вы проверите эти вещи прямо на одном из ваших контроллеров, у вас будет более легкое решение.