Как работают маршруты в FOSRestBundle?

Может ли кто-нибудь четко объяснить, как должны быть настроены маршруты для запросов REST с помощью FOSRest? Кажется, что каждый учебник делает это по-своему.

Мой контроллер:

<?php
namespace Data\APIBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class DatasetController extends Controller{

 protected function postDatasetAction(Request $request){
  //Query here
}

URL-адрес должен выглядеть примерно так: Symfony / web / app_dev.php / api / dataset. Поэтому я подумал, что маршруты должны быть примерно такими ...

приложение / config / routes.yml

data_api:
  resource: "@DataAPIBundle/Resources/config/routing.yml"
  prefix: /api
  type: rest

И....

Данные / APIBundle / Resources / config / routing.yml

data_query:
  type: rest
  pattern:  /dataset
  defaults: {_controller: DataAPIBundle:Dataset:datasetAction, _format: json }
  requirements:
     _method: POST

person user2142111    schedule 06.03.2013    source источник
comment
Этот вопрос непонятен, по крайней мере, для меня (возможно, потому, что я не знаю FOSRestBundle), но что вы хотите знать? Это кажется довольно ясным: у вас есть маршрут под yourWebSiteDomain/api/dataset, к которому вы можете получить доступ только через метод post, а формат запроса должен быть json.   -  person DonCallisto    schedule 07.03.2013
comment
Похоже, пользователь просит каноническое руководство по построению маршрутов в FOSRestBundle. Как он уже упоминал, каждый учебник по FOSRestBundle обрабатывает маршруты по-разному. На самом деле должен быть единый ресурс (то есть - документация проекта), который четко определяет возможные различные конфигурации, поскольку в настоящее время не очевидно, что все возможно.   -  person Jon L.    schedule 07.04.2013


Ответы (2)


Чтобы прочитать официальную документацию, перейдите по следующему URL-адресу: http://symfony.com/doc/master/bundles/FOSRestBundle/index.html

Чтобы начать с этого пакета, я бы посоветовал ознакомиться с документацией по single restful controller: http://symfony.com/doc/master/bundles/FOSRestBundle/5-automatic-route-generation_single-restful-controller.html

Вы также найдете наглядные примеры (https://github.com/liip/LiipHelloBundle) того, что может предложить этот пакет.


Мое внимание привлекли некоторые вещи из опубликованных вами фрагментов:

Видимость вашего метода контроллера защищена, тогда как он должен быть общедоступным (http://symfony.com/doc/current/book/controller.html)

public function postDatasetAction(Request $request) {
     // your code
}

Файл "routing.yml", созданный для настройки вашего маршрута, должен содержать имя вышеупомянутого метода контроллера (postDatasetAction вместо DatasetAction):

# routing.yml
data_query:
    type: rest
    pattern:  /dataset
    defaults: {_controller: DataAPIBundle:Dataset:postDatasetAction, _format: json }
    requirements:
        _method: POST

Ниже приведен пример настройки маршрута, например:

get_items ПОЛУЧИТЕ ЛЮБОЙ ЛЮБОЙ /items.{json}

# config.yml
fos_rest:
    allowed_methods_listener: true

    format_listener:
        default_priorities: ['json', html, '*/*']
        fallback_format: json
        prefer_extension: true

    param_fetcher_listener: true

    routing_loader:
        default_format: json

    view:
        formats:
            json: true
        mime_types:
            json: ['application/json', 'application/x-json']
        force_redirects:
            html: true
        view_response_listener: force

# routing.yml
categories:
    type:     rest
    resource: Acme\DemoBundle\Controller\ItemController

<?php

namespace Acme\DemoBundle\Controller

use FOS\RestBundle\Request\ParamFetcher;
use FOS\RestBundle\Controller\Annotations as Rest;

class ItemController 
{
    /**
     * Get items by constraints
     *
     * @Rest\QueryParam(name="id", array=true, requirements="\d+", default="-1", description="Identifier")
     * @Rest\QueryParam(name="active", requirements="\d?", default="1", description="Active items")
     * @Rest\QueryParam(name="from", requirements="\d{4}-\d{2}-\d{2}", default="0000-00-00", description="From date")
     * @Rest\QueryParam(name="to", requirements="\d{4}-\d{2}-\d{2}", default="0000-00-00", description="End date")
     * @Rest\QueryParam(name="labels", array=true, requirements="\d+", default="-1", description="Labels under which items have been classifed")
     *
     * @Rest\View()
     *
     * @param  ParamFetcher                                          $paramFetcher
     */
    public function getItemsAction(ParamFetcher $paramFetcher) {
        $parameters = $paramFetcher->all();

        // returns array which will be converted to json contents by FOSRestBundle
        return $this->getResource($parameters);
    }
}

P.S. : Вам нужно будет добавить представление для отображения ресурса в виде HTML-страницы.

person Thierry Marianne    schedule 07.04.2013
comment
Документация и комплект Liip довольно ограничены с точки зрения фактического содержания / примеров. Опубликуйте несколько примеров расширенного использования этого пакета, я награжу вас наградой. Например, использование пользовательского маршрута (Route, Get, Post и т. Д.), Волшебное добавление формата запроса к маршрутам, убедительный пример того, как использовать прослушиватель представления для json и html при возврате массива / объекта из вашего действия. - person Jon L.; 09.04.2013
comment
Я думаю, что это отличное решение, но я ищу другие, где происходит инъекция параметров, аналогично файлам .yml (% the_date%), но вместо этого в аннотации действий контроллера FOS этот параметр будет самоинициализирован. Можно было сделать? Пожалуйста, проверьте полный вопрос: github.com/FriendsOfSymfony/FOSRestBundle/issues/774 - person Felix Aballi; 20.05.2014
comment
@ Félix, вы можете захотеть перегрузить класс QueryParam. - person Thierry Marianne; 21.05.2014
comment
@ThierryMarianne, где я могу найти больше фактов? - person Felix Aballi; 21.05.2014
comment
@ Félix, вы можете изучить исходный QueryParam github.com / FriendsOfSymfony / FOSRestBundle / blob / master / - person Thierry Marianne; 21.05.2014
comment
@ThierryMarianne, я читал. Но он не говорит, как расширить класс Param. Есть какой-нибудь пример? - person Felix Aballi; 21.05.2014
comment
@ Félix. Тесты ParamFetcher и других классов также могут оказать большую помощь в понимании того, как классы связаны между собой и как их можно расширить github.com/FriendsOfSymfony/FOSRestBundle/blob/master/Tests/ - person Thierry Marianne; 21.05.2014
comment
Все эти ссылки полностью устарели и неактуальны. - person Pedro Luz; 03.02.2015

вам не хватает части маршрутизации FOSRestbundle в контроллере:

protected function postDatasetAction(Request $request){

  //Query here

} // "post_dataset"      [POST] /dataset
person Kioko Kiaza    schedule 11.04.2013
comment
часть // post_dataset [POST] / набора данных - person Kioko Kiaza; 12.04.2013
comment
Я думаю, что это было просто добавлено в документацию, чтобы лучше проиллюстрировать сгенерированные пакетом маршруты. если это не так, пожалуйста, поправьте меня. - person Tom T; 08.09.2014
comment
Это просто комментарий, а не аннотации. - person Joe; 18.08.2016