我正在使用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
如何解决此问题?
答案 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做类似的事情,这样你就可以保持你的路线分离和维护,但仍然有一个代码库可以更新。