Как работают маршруты в FOSRestBundle? - программирование
Подтвердить что ты не робот

Как работают маршруты в 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/Ресурсы/конфигурации/routing.yml

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

Ответ 1

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

Чтобы начать с этого пакета, я хотел бы предложить следующую документацию по остаточному контроллеру: 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 ПОЛУЧИТЬ ЛЮБОЙ //emems.{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-страницы.

Ответ 2

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

protected function postDatasetAction(Request $request){

  //Query here

} // "post_dataset"      [POST] /dataset