2013-03-06 13 views
14

Czy ktoś może jasno wyjaśnić, w jaki sposób trasy mają być konfigurowane dla żądań REST za pomocą FOSRest? Każdy samouczek wydaje się robić to inaczej.Jak działają trasy w systemie FOSRestBundle?

My Kontroler:

<?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 powinien wyglądać mniej więcej tak: Symfony/web/app_dev.php/api/zestawu danych. Więc pomyślałem, że trasy powinny być coś podobnego ...

app/config/routes.yml

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

i ....

Dane/APIBundle/Resources/config/routing.yml

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

To pytanie nie jest jasne, przynajmniej dla mnie (może dlatego, że nie znam FOSRestBundle), ale co chcesz wiedzieć?Wydaje się to całkiem jasne: masz ścieżkę pod 'yourWebSiteDomain/api/dataset', do której możesz uzyskać dostęp tylko metodą postu, a format żądania powinien być json. – DonCallisto

+2

Wygląda na to, że użytkownik prosi o kanoniczny samouczek dotyczący budowania tras w FOSRestBundle. Jak wspomniał, każdy samouczek dotyczący FOSRestBundle obsługuje trasy inaczej. Rzeczywiście, musi istnieć pojedynczy zasób (tzn. Dokumentacja projektowa), który jednoznacznie definiuje możliwe zmienne konfiguracje, ponieważ obecnie nie jest oczywiste, co jest w ogóle możliwe. –

Odpowiedz

17

Proszę śledzić następny adres URL do zapoznania się z oficjalnej dokumentacji: http://symfony.com/doc/master/bundles/FOSRestBundle/index.html

Aby rozpocząć z tego pakietu, chciałbym zaproponować po pojedynczy spokojny kontrolera dokumentacji: http://symfony.com/doc/master/bundles/FOSRestBundle/5-automatic-route-generation_single-restful-controller.html

Znajdziesz tu również wyraźne przykłady (https://github.com/liip/LiipHelloBundle) o tym, co ten pakiet może zaoferować.


Kilka rzeczy z fragmentów Wysłany zwrócił moją uwagę:

widoczności metody kontrolera jest chroniona podczas gdy powinno być publiczne (http://symfony.com/doc/current/book/controller.html)

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

W „routing. Plik "yml" utworzony do skonfigurowania trasy powinien zawierać nazwę wspomnianej metody kontrolera (PostDatasetAction zamiast Zestaw danych):

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

Poniżej znajduje się przykład konfiguracji trasy jak:

get_items GET Obojętnie /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. : Trzeba będzie dodać widok, aby wyświetlić zasób jako strony HTML

+4

Dokumentacja i pakiet Liip są dość ograniczone pod względem faktycznej zawartości/przykładów. Opublikuj kilka przykładów zaawansowanego użycia tego pakietu, nagrodzę Cię nagrodą. Na przykład, niestandardowe wykorzystanie trasy (Route, Get, Post, itp.), "Magiczne" dodanie formatu żądania do tras, solidny przykład użycia odbiornika widoku dla json i html podczas zwracania tablicy/obiektu ze swojego akcja. –

+1

Wydaje mi się, że to świetne rozwiązanie, ale szukam innych, w których występuje zastrzyk param, podobny do plików .yml (% the_date%), ale zamiast tego w adnotacji akcji FOS Controller, ten parametr zostanie samoczynnie zainicjowany. Może być zrobione? Proszę sprawdzić pełne pytanie: https://github.com/FriendsOfSymfony/FOSRestBundle/issues/774 –

+0

@ Félix, możesz chcieć przeciążyć klasę 'QueryParam'. –

-5

brakuje części routingu FOSRestbundle w kontrolerze:

protected function postDatasetAction(Request $request){ 

    //Query here 

} // "post_dataset"  [POST] /dataset 
+0

Co masz na myśli? –

+0

// "post_dataset" [POST]/dataset part –

+1

Myślę, że zostało to dodane do dokumentacji, aby lepiej zilustrować wygenerowane trasy pakietu. jeśli to jest złe, popraw mnie. –

Powiązane problemy