所以我正在构建一个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路由