2012-12-08 9 views
8

Utilizzo di Symfony2 e FOSRestBundle Sto tentando di implementare metodi API che hanno un certo numero di parametri fissi definiti nel percorso insieme ad alcuni parametri opzionali che possono esistere nella stringa di query.Miscelazione di route e parametri di query utilizzando FOSRestBundle con Symfony

Ad esempio:

http://somesite.com/api/method/a/b 
http://somesite.com/api/method/c/d?x=1&y=2 

Secondo the documentation for FOSRestBundle, ParamFetcher è il modo corretto per farlo, usando l'annotazione @QueryParam. Tuttavia, ho già un controller definito come:

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use FOS\RestBundle\Controller\Annotations\Get; 
use FOS\RestBundle\Controller\Annotations\View; 

class MyController extends Controller 
{ 

    /** 
    * @Get("/method/{a}/{b}") 
    * @View() 
    */ 
    public function getMethodAction($a, $b) 
    { 
    // do stuff 

    return array('foo' => 'bar'); 
    } 

} 

Ora sembra che ho bisogno di essere in grado di ottenere l'accesso a un'istanza di ParamFetcher, ma non so come (e ricerche di Google non hanno aiutato molto) . So dalla documentazione che posso semplicemente cambiare la firma del metodo per incorporare ParamFetcher, tuttavia, quando lo faccio sposta i parametri nella stringa di query, che non posso avere.

C'è un modo per mescolare i due, o dovrei rinunciare a ParamFetcher e andare semplicemente a ispezionare la richiesta direttamente usando l'oggetto Request incorporato di Symfomy?

risposta

12

Questa domanda è piuttosto vecchia e probabilmente hai già trovato una soluzione, ma dato che sono arrivato qui attraverso la ricerca su Google e conosco una risposta, contribuirò.

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\JsonResponse; 
use FOS\RestBundle\Request\ParamFetcher; 
use FOS\RestBundle\Controller\Annotations\QueryParam; 
use Nelmio\ApiDocBundle\Annotation\ApiDoc; 

class DefaultController extends Controller 
{ 
    /** 
    * Returns a collection of Task 
    * 
    * @QueryParam(name="projectId", nullable=true, requirements="\d+") 
    * @QueryParam(name="name", nullable=true, description="Project Name") 
    * @QueryParam(name="assignee", nullable=true) 
    * @QueryParam(name="depth", nullable=true) 
    *   * 
    * @param ParamFetcher $paramFetcher 
    * @ApiDoc() 
    * 
    * @return JsonResponse 
    */ 
    public function cgetTaskAction(ParamFetcher $paramFetcher) 
    { 
     foreach ($paramFetcher->all() as $criterionName => $criterionValue) { 
      // some logic here, eg building query 
     } 

     $results = // query database using criteria from above 

     // this is just a simple example how to return data 
     return new JsonResponse($results); 
    } 
} 
+1

Grazie per il follow-up, alla fine l'ho capito e ho trascurato di tornare ad esso. – futureal

5

Volevo solo inviare una risposta perché la risposta originale utilizza solo QueryParams, e la questione stava usando QueryParams insieme RouteParams.

Se si desidera utilizzare parametri di percorso e parametri di query, è possibile utilizzare ParamFetcher come primo argomento dell'azione e aggiungere gli argomenti del percorso in un secondo momento.

Non ho ancora trovato un modo per aggiungere i parametri del percorso al paramFetcher.

/* 
* @Route("/term/{termId}", requirements={"termId" = "[a-z0-9]+"}) 
* 
* @QueryParam(name="limit", requirements="\d+", default="30", description="How many documents to return.") 
* 
* @Method("GET") 
* 
* @param ParamFetcherInterface $paramFetcher 
* @param $termId 
* @return array() 
*/ 
public function getTermFeedAction(ParamFetcherInterface $paramFetcher, $termId) { 
    // access $termId over the method parameter 
    // access the @queryparams via the $paramFetcher 

} 
+0

Una risposta migliore in quanto non interrompe l'iniezione del parametro param. – Ryall

Problemi correlati