【问题标题】:How to use FOSRestBundle manual routes with CRUD from Symfony2?如何使用来自 Symfony2 的 CRUD 的 FOSRestBundle 手动路由?
【发布时间】:2013-11-22 21:16:41
【问题描述】:

我正在使用 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

我该如何解决这个问题?

【问题讨论】:

    标签: symfony annotations fosrestbundle


    【解决方案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 控制器的路径,比如说从浏览器?我只想让一个基本示例正常工作,然后我可以从中学习。谢谢!
    • 如果您遵循我对 FOSRestBundle 使用的方法,则用于测试的路径将是 /users/{id}。普通的 CRUD 控制器遵循与任何 symfony2 应用程序相同的约定。创建一个视图,创建控制器来渲染视图,并创建一个将调用控制器的路由。
    • 当 symfony2 生成的路由已经工作时,我真的需要两组路由吗,为什么我都需要? FOSRestBundle 会有什么不同?我问这个是因为现在我有两个实例,有点混乱,为什么我不能单独使用 Symfony2 创建的 CRUD??
    • 我想这取决于你想如何构建你的应用程序。如果您基于 API 响应(JSON、xml、...)构建应用程序,那么您只需要 REST API。如果你想使用 Symfony 工具(比如表单),那么 API 响应将不起作用,你需要返回一个视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 2013-03-14
    • 2013-02-22
    • 1970-01-01
    相关资源
    最近更新 更多