2013-03-06 11 views
14

Qualcuno può spiegare chiaramente come devono essere configurati i percorsi per le richieste REST usando FOSRest? Ogni tutorial sembra farlo in modo diverso.Come funzionano gli itinerari in FOSRestBundle?

mio controller:

<?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 
} 

L'URL dovrebbe essere simile a questo: Symfony/web/app_dev.php/api/set di dati. Così ho pensato che i percorsi dovrebbero essere qualcosa di simile ...

app/config/routes.yml

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

E ....

dati/APIBundle/Resources/config/routing.yml

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

Questa domanda non è chiaro, almeno per me (forse perché non conosco FOSRestBundle) ma, cosa vuoi sapere?Questo sembra abbastanza chiaro: hai un percorso sotto 'yourWebSiteDomain/api/dataset' a cui puoi accedere solo tramite il metodo post e il formato della richiesta dovrebbe essere json. – DonCallisto

+2

Sembra che l'utente stia richiedendo un tutorial canonico su come costruire percorsi in FOSRestBundle. Come menzionato, ogni tutorial su FOSRestBundle gestisce le rotte in modo diverso. In realtà, è necessario che ci sia una singola risorsa (vale a dire, i documenti del progetto) che definisce chiaramente le possibili configurazioni variabili, poiché al momento non è evidente ciò che è possibile. –

risposta

17

si prega di seguire il prossimo URL di leggere la documentazione ufficiale: http://symfony.com/doc/master/bundles/FOSRestBundle/index.html

iniziare con questo pacchetto, vorrei suggerire a seguito della unico controller riposante documentazione: http://symfony.com/doc/master/bundles/FOSRestBundle/5-automatic-route-generation_single-restful-controller.html

Troverete anche esempi chiari (https://github.com/liip/LiipHelloBundle) su ciò che questo pacchetto può offrire.


Poche cose dai frammenti che hai postato ha attirato la mia attenzione:

la visibilità del tuo metodo di controllo è protetto mentre dovrebbe essere pubblico (http://symfony.com/doc/current/book/controller.html)

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

Il "routing. yml "Il file creato per configurare il percorso deve contenere il nome del suddetto metodo di controllo (postDatasetAction anziché DatasetAction):

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

Di seguito riportiamo un esempio per impostare un percorso simile:

get_items ottenere qualsiasi QUALSIASI /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. : È necessario aggiungere una vista per visualizzare la risorsa come una pagina HTML

+4

La documentazione e il pacchetto Liip sono entrambi abbastanza limitati in termini di contenuto/esempi reali. Pubblica alcuni esempi di utilizzo avanzato di questo pacchetto, ti assegnerò la taglia. Ad esempio, l'utilizzo personalizzato del percorso (Route, Get, Post, ecc.), L'aggiunta "magica" del formato della richiesta ai percorsi, un solido esempio di come utilizzare il listener di visualizzazione per json e html mentre si restituisce un array/oggetto dal azione. –

+1

Penso che sia ottima la soluzione, ma sto cercando altri in cui l'iniezione params si verifica, in modo simile ai file .yml (% the_date%), ma nell'annotazione dell'azione di FOS Controller, invece, il parametro sarà autoinizializzato. Potrebbe essere fatto? Per favore, controlla l'intera domanda: https://github.com/FriendsOfSymfony/FOSRestBundle/issues/774 –

+0

@ Félix, potresti voler sovraccaricare la classe 'QueryParam'. –

-5

vi manca la parte di routing della FOSRestbundle nel controller:

protected function postDatasetAction(Request $request){ 

    //Query here 

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

Cosa intendi? –

+0

// // "post_dataset" [POST]/set di dati parte –

+1

Penso che questo è stato appena aggiunto alla documentazione per illustrare meglio i percorsi generati dal pacchetto. se questo è sbagliato per favore correggimi. –