2012-12-08 11 views
8

सिम्फनी 2 और एफओएसआरएस्टबंडल का उपयोग करके FOSRestBundle का उपयोग करके मार्ग और क्वेरी पैरामीटर मिलाकर मैं एपीआई विधियों को लागू करने का प्रयास कर रहा हूं जिनमें रूट स्ट्रिंग में मौजूद कुछ वैकल्पिक पैरामीटर के साथ रूट में परिभाषित कुछ निश्चित पैरामीटर हैं।सिमफोनी

उदाहरण के लिए:

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

the documentation for FOSRestBundle के अनुसार, ParamFetcher ऐसा करने के लिए, @QueryParam एनोटेशन का उपयोग कर उचित तरीका है। हालांकि, मैं पहले से ही एक नियंत्रक की तरह परिभाषित किया है:

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'); 
    } 

} 

अब यह मैं ParamFetcher का एक उदाहरण के लिए उपयोग करने में सक्षम होने की जरूरत है लगता है, लेकिन मैं नहीं जानता कि कैसे (और गूगल खोजों ज्यादा मदद नहीं की है) । मुझे प्रलेखन से पता है कि मैं पैरामफैचर को शामिल करने के लिए विधि हस्ताक्षर को आसानी से बदल सकता हूं, हालांकि, जब मैं ऐसा करता हूं तो यह पैरामीटर को क्वेरी स्ट्रिंग में ले जाता है, जो मेरे पास नहीं हो सकता है।

क्या दो मिश्रण करने का कोई तरीका है, या मुझे पैरामफेचर पर छोड़ देना चाहिए और सिमफॉमी के अंतर्निहित अनुरोध ऑब्जेक्ट का उपयोग करके सीधे अनुरोध का निरीक्षण करने के लिए जाना चाहिए?

उत्तर

12

यह प्रश्न काफी पुराना है और आपको शायद पहले से ही एक समाधान मिला है, लेकिन जब से मैं यहां Google खोज के माध्यम से आया हूं और एक उत्तर जानता हूं तो मैं योगदान दूंगा।

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

फॉलो-अप के लिए धन्यवाद - अंततः मैंने इसे समझ लिया और इसे वापस आने के लिए उपेक्षित किया। – futureal

5

बस एक जवाब पोस्ट करने के लिए, क्योंकि मूल जवाब केवल QueryParams का उपयोग करता चाहते थे, और सवाल RouteParams के साथ एक साथ QueryParams उपयोग कर रहा था।

यदि आप रूट पैरा और क्वेरी पैराम्स का उपयोग करना चाहते हैं, तो आप पैरामफ़ेचर को क्रिया के पहले तर्क के रूप में उपयोग कर सकते हैं और बाद में रूट तर्क जोड़ सकते हैं।

मुझे अभी तक 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

एक बेहतर उत्तर क्योंकि यह मार्ग सर्वो इंजेक्शन को बाधित नहीं करता है। – Ryall