Symfony控制器:重定向,路由或其他东西


Symfony controller: redirect, route or something else?

所以我正在构建一个Symfony web应用程序。

我有一个简单的控制器(DefaultController.php)如下:
<?php
namespace AppBundle'Controller;
use Sensio'Bundle'FrameworkExtraBundle'Configuration'Route;
use Symfony'Bundle'FrameworkBundle'Controller'Controller;
use Symfony'Component'HttpFoundation'Response;
class DefaultController extends Controller
{
  /**
  * @Route("/", name="default")
  */
  public function defaultAction(){
    return $this->render('default/hello.html.twig', array(
      'name' => "hello"
    ));
  }
}

没什么特别的。

现在,我想有一个单独的。php文件名为APIController.php,当用户导航到http://eamorr.com/api/

时调用该文件

APIController.php将处理如下请求:

    http://eamorr.com/api/getUser
  • http://eamorr.com/api/addUser
  • http://eamorr.com/api/getAllUsers

APIController.php应该是这样的:

<?php
namespace AppBundle'Controller;
use Sensio'Bundle'FrameworkExtraBundle'Configuration'Route;
use Symfony'Bundle'FrameworkBundle'Controller'Controller;
use Symfony'Component'HttpFoundation'Response;
class APIController extends Controller
{
    /**
     * @Route("/getUser", name="getUser")
     */
    public function getUser(){
        //
    }
    /**
     * @Route("/addUser", name="addUser")
     */
    public function addUser(){
        //
    }
    /**
     * @Route("/getAllUsers", name="getAllUsers")
     */
    public function getAllUsers(){
        //
    }
    //etc.

}

从架构的角度来看,我这样做对吗?有没有人有什么建议关于如何在Symfony中做到这一点?

如果你定义的路由如下:

/**
 * @Route("/getUser", name="getUser")
 */
public function getUser(){
    //
}

那么此操作的URL将是http://eamorr.com/getUser。正如你所看到的,没有/api部分,这是因为你没有在任何地方提到它。

对于这种情况,你有两个解决方案。

首先定义完整的路由,如

/**
 * @Route("/api/getUser", name="getUser")
 */
public function getUser(){
    //
}

第二:因为你想要所有的APIController动作都有这个/api部分,你可以通过为整个类定义"基"路由来为所有路由定义一个前缀。

/**
 * @Route("/api", name="getUser")
 */
 class APIController extends Controller

那么你可以让你的动作的路由保持原样。

更多信息:http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/routing.html#route-prefix

你做对了。但是,如果您希望支持多种请求和响应格式(例如。JSON, XML)你最好使用FOSRestBundle。

它可以处理内容协商,实体序列化(使用由FOSRest Bundle使用的JMSSerializerBundle),它允许你构建RESTful路由