如何在Symfony2中使用带有CRUD的FOSRestBundle手动路由?

时间:2013-11-22 21:16:41

标签: symfony annotations fosrestbundle

我正在使用FOSRestBundle来创建REST应用程序,但由于REST功能只是其中的一部分,我还使用了一些Symfony2内置自动化工具来生成我的CRUD代码。一切正常但我无法正确映射路线,我将欣赏一些有关如何手动执行此操作的见解和示例。我已经阅读了FOS手册中的手动路由定义,说明使用了给定的注释,但是我如何做到这一点,因为Symfony2创建的CRUD代码使用了不同的注释?

以下是一个例子:

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手册给出了GET的注释 use FOS\RestBundle\Controller\Annotations\Get;

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

当我使用路由/index时,它会给我一个错误,我在config.yml中的路由定义是:

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

如何解决此问题?

1 个答案:

答案 0 :(得分: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做类似的事情,这样你就可以保持你的路线分离和维护,但仍然有一个代码库可以更新。