2016-05-20 4 views
1

Я использую Symfony2 с FOSRestBundle. Возможно ли иметь функциональные возможности аннотаций @QueryParam и @RequestParam без использования аннотаций?Symfony - запрос фильтра с помощью FOSRestBundle и body_listener без аннотаций?

Я пытаюсь создать json api (format), поэтому я хочу разрешить параметры запроса, такие как include, page, filter, fields и sort. Моим идеальным способом справиться с этим было бы:

  1. Используйте format_listener, чтобы определить, что это json.
  2. Используйте обработчик json для обработки запроса, чтобы он был похож на this.
  3. Контроллер проверяет параметры запроса/запроса внутри функции действия и генерирует исключение, которое должно обрабатываться контроллером исключения, если оно недействительно. (Body_listener будет действовать как помощник, чтобы облегчить извлечение данных из запроса в контроллере, но контроллер принимает решения о том, что делать с этими данными.)

Я в основном зациклен на том, как создать пользовательский body_listener. Я не уверен, что мне нужно будет создать собственный декодер или нормализатор, и что этот класс может выглядеть, так как они не дают никаких примеров.

Грубый код какой контроллер будет выглядеть следующим образом:

<?php 
namespace CoreBundle\Controller; 

use FOS\RestBundle\Controller\FOSRestController; 
use FOS\RestBundle\View\View; 
use FOS\RestBundle\Context\Context; 
use Psr\Http\Message\ServerRequestInterface; 

class SiteController extends FOSRestController 
{ 
    public function getAction($id, ServerRequestInterface $request) 
    { 
     try { 
      // Validate $request. This is where the query/request 
      // param annotation functionality would be replaced. 
     } catch (Exception $e) { 
      throw new InvalidRequestException($e); 
     } 

     $siteService = $this->get('app.site_service'); 
     $site = $siteService->getSite($id); 

     $context = new Context(); 

     $context->setVersion($request->getVersion()); 
     // Ex: /sites/63?fields[sites]=name,address&fields[company]=foo,bar 
     if ($request->hasIncludeFields()) { 
      $context->addAttribute('include_fields', $request->getIncludeFields()); // Or however to do this 
     } 

     $view = new View($site, 200); 

     $view->setContext($context); 

     return $view; 
    } 
} 

ответ

1

Вы можете определить параметры динамически парам Сборщике. Это описано в documentation.

Например:

С аннотациями:

<?php 

namespace ContentBundle\Controller\API; 

use FOS\RestBundle\Controller\FOSRestController; 
use FOS\RestBundle\Controller\Annotations\QueryParam; 
use FOS\RestBundle\Request\ParamFetcher; 

class PostController extends FOSRestController 
{ 
    /** 
    * @QueryParam(name="sort", requirements="(asc|desc)", allowBlank=false, default="asc", description="Sort direction") 
    */ 
    public function getPostsAction(ParamFetcher $paramFetcher) 
    { 
     $sort = $paramFetcher->get('sort'); 
    } 
} 

Без аннотаций:

<?php 

namespace ContentBundle\Controller\API; 

use FOS\RestBundle\Controller\FOSRestController; 
use FOS\RestBundle\Controller\Annotations\QueryParam; 
use FOS\RestBundle\Request\ParamFetcher; 

class PostController extends FOSRestController 
{ 
    public function getPostsAction(ParamFetcher $paramFetcher) 
    { 
     $sort = new QueryParam(); 
     $sort->name = 'sort'; 
     $sort->requirements = '(asc|desc)'; 
     $sort->allowBlank = false; 
     $sort->default = 'asc'; 
     $sort->description = 'Sort direction'; 

     $paramFetcher->addParam($sort); 

     $param = $paramFetcher->get('sort'); 
     // 
    } 
} 
+0

Можно ли иметь контроллер получить ParamFetcher и объект запроса? – GreeKatrina

+1

@GreeKatrina да как в обычном контроллере symfony –