2013-11-22 1 views
0

은 내가 REST 응용 프로그램을 만들 수 FOSRestBundle를 사용하고 있지만, REST 특징 이후에만 일부, 나 또한 내 CRUD 코드를 생성하는 내장 된 자동화 도구 Symfony2의 일부를 사용하고있다. 모든 것이 잘 작동하지만 경로를 올바르게 매핑 할 수 없기 때문에이 방법을 수동으로 수행하는 방법에 대한 통찰력과 예제를 고맙게 생각합니다. 나는 주어진 주석을 사용 알리는 FOS 설명서에 수동 경로 정의를 읽을 수는 있지만 내가 Symfony2에 의해 생성 된 CRUD 코드 때문에 이렇게 어떻게 다른 주석을 사용했다? 여기 Symfony2의 CRUD와 함께 FOSRestBundle 수동 경로를 사용하는 방법은 무엇입니까?

은 예입니다

class UserController extends Controller 
{ 

    /** 
    * Lists all User entities. 
    * 
    * @Route("/", name="user") 
    * @Method("GET") 
    * @Template() 
    */ 
    public function indexAction() 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $entities = $em->getRepository('CompanyWebServicesBundle:User')->findAll(); 

     return array(
      'entities' => $entities, 
     ); 
    } 

FOSRest 설명서가 use FOS\RestBundle\Controller\Annotations\Get;

/** 
* GET Route annotation. 
* @Get("/likes/{type}/{typeId}") 
*/ 

내가 /index 같은 경로를 사용하는 등 GET에 대한 주석을 제공합니다, 그것은 내게 오류 준다 내 경로 정의 config.yml에서 :

index: 
    type: rest 
    resource: Company\WebservicesBundle\Controller\UserController 

이 문제를 어떻게 해결할 수 있습니까? 내가 당신이라면

답변

1

, 나는 당신의 REST 컨트롤러와 일반적인 CRUD 컨트롤러에 대해 별도의 번들을 만들 것입니다. 이것은 일을 더 쉽게 유지할 수있게 해줄 것입니다 (제 의견으로는). 예를 들어 AcmeMainBundle과 AcmeRestBundle을 만든 다음 두 번들에서 호출 할 작업을 실제로 수행하는 별도의 클래스를 만듭니다. 이런 식으로 뭔가 : 다음

// src/Acme/MainBundle/Crud/User.php (create this folder structure) 

class User{ 
    private $em; 

    public function __construct($em){ 
     $this->em = $em; 
    } 

    public function getUser($id){ 
     return $this->em->getRepository('AcmeMainBundle:User')->find($id); 
    } 
} 

: 다음

// src/Acme/MainBundle/Controller/UserController.php 

use Symfony\Component\HttpFoundation\Request; 
use Acme\MainBundle\Crud\User; 

class UserController extends Controller { 
    public function getAction($request){ 
     $em = $this->getDoctrine()->getManager(); 
     $getUser = new User($em); 
     $user = $getUser ->getUser($request->query->get('user_id')); 

     // return response 
    } 
} 

그리고 :

// src/Acme/RestBundle/Controller/UserController.php 

use FOS\RestBundle\Controller\Annotations as Rest; 
use FOS\RestBundle\Routing\ClassResourceInterface; 
use Symfony\Component\HttpFoundation\Request; 

class UserController extends Controller implements ClassResourceInterface { 
    /** 
    * @Rest\View() 
    */ 
    public function getAction($id){ 
     $em = $this->getDoctrine()->getManager(); 
     $getUser = new User($em); 
     $user = $getUser ->getUser($id); 

     // return using the default format defined in config.yml 
     return array(
      "success"=>'true', 
      "user" => $user 
     ); 
    } // get_user [GET] /users/{id} 
} 

ClassResourceInterface를 사용하여 귀하의 메소드 이름을 의미주의는 경로를 생성하는 데 사용됩니다. 이에 대한 자세한 내용은 FOSRestBundle Docs을 참조하십시오. 당신은 모든 CRUD이 비슷한 작업을 수행 할 수 있습니다

, 당신이 당신의 경로를 유지하는 방법은 분리 및 유지 보수,하지만 여전히 업데이트 할 수있는 단일 코드 기반을 가지고있다. 내가 브라우저에서 말을 할 수있는 CRUD 및 REST 컨트롤러에 액세스 할 수있는 경로를 지정하는 방법

+0

는 지정할 수 있을까요? 나는 단지 하나의 기본적인 예제가 작동하도록하고 싶다. 그리고 나는 그것으로부터 배울 수있다. 감사! 당신은 내가 FOSRestBundle와 함께 사용되는 방법을 다음과 같은 경우 –

+0

이 경로는 '/ 사용자/{ID}'이 될 것입니다 테스트에 사용할 수 있습니다. 일반적인 CRUD 컨트롤러는 symfony2 앱과 동일한 규칙을 따릅니다. 보기를 작성하고,보기를 렌더링 할 제어기를 작성하고, 제어기를 호출 할 라우트를 작성하십시오. – Sehael

+0

symfony2가 생성 한 경로가 실제로 작동 할 때 두 세트의 경로가 필요합니까? 왜 두 경로가 모두 필요합니까? FOSRestBundle은 무엇을 다르게 할 것인가? 이제는 두 개의 인스턴스가 있는데 약간 혼란 스럽기 때문에 Symfony2 단독으로 만든 CRUD를 사용할 수없는 이유는 무엇입니까? –

관련 문제