0

我正在使用 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}")
 */

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

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

我该如何解决这个问题?

4

1 回答 1

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 文档

你可以对所有的 CRUD 做类似的事情,这样你就可以保持你的路由独立和可维护,但仍然有一个单一的代码库要更新。

于 2013-11-22T22:22:34.850 回答