programing

Symfony2, 액션이 Ajax에서 호출되는지 확인합니다.

copysource 2023. 3. 26. 14:32
반응형

Symfony2, 액션이 Ajax에서 호출되는지 확인합니다.

컨트롤러의 각 액션에 대해 이러한 액션이 Ajax 요구에 의해 호출되는지 확인해야 합니다.

[네]의 경우는 아무것도 추가되지 않고 [아니오]의 경우는 홈페이지로 리다이렉트 할 필요가 있습니다.

나는 방금 찾았다.if($this->getRequest()->isXmlHttpRequest())단, 각 액션에 이 검증을 추가해야 합니다.

더 좋은 방법을 알고 있니?

아주 쉬워요!

사용 중인 메서드에 $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'));
        }
    }

}

이를 자동으로 수행하려면 커널 요청 수신기를 정의해야 합니다.

재사용 가능한 기술에는 기본 템플릿에서 다음을 사용합니다.

{# app/Resources/views/layout.html.twig #}
{% extends app.request.xmlHttpRequest 
     ? '::ajax-layout.html.twig'
     : '::full-layout.html.twig' %}

확장 템플릿은 모두layout.html.twigAjax에서 생성되면 표준 마크업을 모두 자동으로 삭제할 수 있습니다.

원천

먼저 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() 메서드를 만들고 요청 스택을 contrcutor를 통해 주입합니다.onRequestAction() 내에서 다음과 같은 컨트롤러 이름을 얻을 수 있습니다.

$this->requestStack->getCurrentRequest()->get('_controller');

컨트롤러 이름과 액션이 반환됩니다(:로 구분되어 있는 것 같습니다).문자열을 해석하여 올바른 컨트롤러인지 확인합니다.이 경우 다음과 같이 XmlHttpRequest임을 확인합니다.

$this->requestStack->getCurrentRequest()->isXmlHttpRequest();

그렇지 않으면 리디렉션/전송할 수 있습니다.

또한 이것은 모든 요청마다 확인된다는 점에 유의하십시오.컨트롤러 중 하나에서 직접 확인하면 보다 가벼운 솔루션을 얻을 수 있습니다.

언급URL : https://stackoverflow.com/questions/23911982/symfony2-check-if-an-action-is-called-by-ajax-or-not

반응형