2014-07-10 4 views
0

많은 AJAX 요청을 사용하는 응용 프로그램이 있다고 가정합니다.AJAX 작업으로 Symfony 동작 편집

심포니 동작을 편집하고 내 요청이 AJAX 일 때 indexAction 대신에 indexAjaxAction을 자동으로 호출 할 수 있습니까?

는 이미 요청이 Request::isXmlHttpRequest() 방법 아약스 경우 내가 테스트 할 수 있음을 알고 있지만 나는 (각 controllerAction의 시험없이 ) autommatic되고 싶어요.

서비스/번들로 이미 만들어 졌습니까?

예 :

<?php 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class FooController extends Controller 
{ 
    public function indexAction($vars) 
    { 
     $request = $this->getRequest();   
     if($request->isXmlHttpRequest()) { 
      return $this->indexAjaxAction($vars); 
     } 
     // Do Stuff 
    } 

    public function indexAjaxAction($vars){ /* Do AJAX stuff */ } 
} 

는 당신이 JSON을 반환 할 수 있습니다 (1 개) 작업이있는 경우 매우 유용 할 수

<?php 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class FooController extends Controller 
{ 
    public function indexAction($vars) { } 
    public function indexAjaxAction($vars) { } 

    // Other functions 
} 

답변

2

한 가지 방법은 현재 컨트롤러 확인자 대신에 사용되는 약간 수정 된 컨트롤러 확인자를 보통 KttpKernel::handleRawprocess에 사용하십시오.

여기 내 생각이 틀릴 수도 있으므로 테스트되지 않았습니다.

컨트롤러 해결 클래스는 새로운 ControllerResolver에 당신이 당신의 app/config/config.yml에서

를 사용하여 설정에서 사용자 정의 하나를 덮어 쓸 수있는 ID controller_resolver.class ...

.. config stuff .. 

parameters: 
    controller_resolver.class: Acme\SomeBundle\Controller\ControllerResolver 

그리고있다 ...

namespace Acme\SomeBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver 
        as BaseControllerResolver; 

class ControllerResolver extends BaseControllerResolver 
{ 
    /** 
    * {@inheritdoc 
    */ 
    public function getArguments(Request $request, $controller) 
    { 
     if (is_array($controller) && $request->isXmlHttpRequest()) { 
      $action = preg_replace(
       '/^(.*?)Action$/', 
       '$1AjaxAction', 
       $controller[1] 
      ); 

      try { 
       $r = new \ReflectionMethod($controller[0], $action); 

       return $this->doGetArguments(
        $request, 
        $controller, 
        $r->getParameters() 
       ); 
      } catch(\Exception $e) { 
       // Do nothing 
      } 
     } 

     return parent::getArguments($request, $controller); 
    } 
} 

이 클래스는 현재 컨트롤러 확인자를 확장하며 youractionAjaxAction 컨트롤러에있는 경우 오류가 발생하면 일반 해결 프로그램으로 폴백합니다 (메서드를 찾을 수 없음).

또는

당신은 그냥 사용할 수 있습니다 ... 단지라는 조치를 업데이트 한 다음 의미, 다시없는 가을에 정규 해결에 통해 보낼 것이다

if (is_array($controller) && $request->isXmlHttpRequest()) { 
    $controller[1] = preg_replace(
     '/^(?P<action>.*?)Action$/', 
     '$1AjaxAction', 
     $controller[1] 
    ); 
} 

return parent::getArguments($request, $controller); 

..

이 호출 할 수있는 모든 조치 XmlHttpRequest을 사용하려면 해당 AjaxAction이 필요합니다.

+0

+1 귀하의 빠른 답변을 위해, 나는 그것을 처리하려고 노력하고 해결 된 것으로 표시됩니다. 고마워요! –

1

당신은 심포니 FOSRestBundle을 조사 할 수 있습니다된다 요청 방법에 따라 데이터 또는 렌더링 된 HTML 템플릿

+0

+1 번들에 대해 유용 할 수 있지만 제 질문은 더 구체적입니다. 내가 찾고있는 것은 내가 사용하고있는 HTTP 메소드에 의존하지 않는다. –

+0

안녕하세요 Fabien, 그 isAjaxRequest 실제로 당신을 위해 검사를 할 것입니다, 그래서 심지어 동일한 HTTP 메서드를 사용 하여 다르게 렌더링됩니다. – mr1031011