2011-10-24 83 views
9

是否有人在控制器中使用了put,get,post,delete註釋(https://github.com/FriendsOfSymfony/FOSRestBundle/blob/master/Controller/Annotations/)。symfony2 FOSRestBundle註釋

我試圖像這樣使用它,但它仍然需要獲取方法。這些註釋在FOSRestBundle中的用途是什麼?

/** 
* @Route("/get/{id}", defaults={"_format" = "json"}) 
* @Post 
*/ 
public function getObject($id) {  
    $object = $this->getService()->findById($id); 
    return $object; 
} 

回答

13

我想共享有關所有註釋的信息。

@Get,@Post,@Put,@Delete,@Head,@Patch是@Route + @method快捷方式,而不是用他們兩個,你可以指定一個,例如:

/** 
    * @Get("/hello/{id}") 
    * 
    */ 
    public function helloAction($id) 
    { 
     return array(); 
    } 

信息約@View爲doc:https://github.com/FriendsOfSymfony/FOSRestBundle/blob/master/Resources/doc/3-listener-support.md

@View //Guess template name 
@View("AcmeHelloBundle::layout.html.twig") //Load Resources/views/layout.html.twig 
@View("AcmeHelloBundle::layout.html.twig", templateVar="test") // if returned data doesn't 
    // have a key (e.g. return array("string", 5) instead of default variable 'data', 
    // it's placed inside 'test' variable inside template. 
@View(statusCode=204) // set HTTP header's status code 

名稱前綴可以添加到任何文件routing.yml中或作爲註解。它也記錄 - https://github.com/FriendsOfSymfony/FOSRestBundle/blob/master/Resources/doc/6-automatic-route-generation_multiple-restful-controllers.md

有時候,路由自動命名將導致路由名稱衝突,所以 RestBundle路線集合提供了一個name_prefix(名稱前綴 XML /陽明和@NamePrefix註解)參數:

#src/Acme/HelloBundle/Resources/config/users_routes.yml comments: 
    type:   rest 
    resource:  "@AcmeHelloBundle\Controller\CommentsController" 
    name_prefix: api_ 

利用這種配置,路由名稱會變成: api_vote_user_comment

@Prefix當您有父資源並且需要在子代之前添加前綴時特別有用。 例子:

父:

class UsersController extends Controller 
{ 
    public function getUserAction($slug) 
    {} // "get_user" [GET] /users/{slug} 
} 

孩子:

class CommentsController extends Controller 
{ 
    public function getCommentAction($slug, $id) 
    {} // "get_user_comment" [GET] 
} 

現在行動getCommentAction與/用戶/ {}塞相當於/評論/(編號)路徑。

隨着@prefix( 「some_prefix」)生成的路徑將是/用戶/ {段塞}/some_prefix /評論/ {ID}

,並通過使用所述@NoRoute方法級註釋,路線將不會生成。

2

你不應該把id放在路由中(因爲這相當於get)。相反,你應該這樣做,強制ID參數發送$ _POST

/** 
* @Route("/get", defaults={"_format" = "json"}) 
* @Post 
*/ 
public function getObject() { 
    $id = $this->Request::createFromGlobals()->request->get('id'); 
    $object = $this->getService()->findById($id); 
    return $object; 
}