symfony2 FOSRestBundle аннотации - PullRequest
       9

symfony2 FOSRestBundle аннотации

9 голосов
/ 24 октября 2011

Кто-нибудь использовал положить, получить, опубликовать, удалить аннотации (https://github.com/FriendsOfSymfony/FOSRestBundle/blob/master/Controller/Annotations/) в контроллере.

Я пытаюсь использовать его таким образом, но он все еще требует методов get. Какова цель этих аннотаций в FOSRestBundle

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

Ответы [ 2 ]

14 голосов
/ 29 марта 2012

Я хочу поделиться информацией обо всех аннотациях.

@ Get, @Post, @Put, @Delete, @Head, @ Patch - это ярлыки для @Route + @Method,вместо того, чтобы использовать их оба, вы можете просто указать один, например:

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

Информация о @ Просмотр находится в документе: 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 / yml иПараметр @NamePrefix для аннотаций):

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

При такой конфигурации имя маршрута будет следующим: api_vote_user_comment

@ Prefix isособенно полезно, когда у вас есть родительский ресурс и вам нужно добавить префикс перед дочерним.Пример:

parent:

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

child:

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

Теперь действие getCommentAction соответствует / users / {slug} / comments / {id} path.

С @Prefix ("some_prefix") сгенерированный путь будет / users / {slug} / some_prefix / comments / {id}

А с помощью аннотации на уровне метода @ NoRoute маршрут не будет сгенерирован.

2 голосов
/ 21 декабря 2011

Вы не должны помещать идентификатор в маршрут (так как это эквивалентно получению). Вместо этого вы должны сделать это, чтобы заставить параметр 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;
}
...