2015-11-29 2 views
3

В Symfony2 параметры маршрута могут автоматически отображаться на аргументы контроллера, например: http://a.com/test/foo возвращает «Foo»Symfony2: Автоматически отобразить строку запроса в параметре контроллера

/** 
    * @Route("/test/{name}") 
    */ 
    public function action(Request $request, $name) { 
     return new Response(print_r($name, true)); 
    } 

см http://symfony.com/doc/current/book/routing.html#route-parameters-and-controller-arguments

Но я хотите использовать строку запроса вместо например: http://a.com/тест имя = Foo

Как это сделать? Для меня есть только 3 решения:

  • повторно реализовать ControllerResolverInterface
  • использовать пользовательский ParamConverter
  • $ имя = $ request-> query-> Get ('имя');

Есть ли другое решение?

ответ

5

Я предоставить вам код для тех, которые хотят использовать преобразователь:

use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; 
use Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\ParamConverterInterface; 
use Symfony\Component\HttpFoundation\Request; 

/** 
* Put specific attribute parameter to query parameters 
*/ 
class QueryStringConverter implements ParamConverterInterface{ 
    public function supports(ParamConverter $configuration) { 
     return 'querystring' == $configuration->getConverter(); 
    } 

    public function apply(Request $request, ParamConverter $configuration) { 
     $param = $configuration->getName(); 
     if (!$request->query->has($param)) { 
      return false; 
     } 
     $value = $request->query->get($param); 
     $request->attributes->set($param, $value); 
    } 
} 

services.yml:

services: 
    querystring_paramconverter: 
    class: AppBundle\Extension\QueryStringConverter 
    tags: 
     - { name: request.param_converter, converter: querystring } 

В контроллере:

/** 
* @Route("/test") 
* @ParamConverter("name", converter="querystring") 
*/ 
public function action(Request $request, $name) { 
    return new Response(print_r($name, true)); 
} 
+0

Фантастическая решение, спасибо. –

1

усовершенствованное решение на основе ответа Реми, который будет отображать параметр для объекта:

<?php 
namespace AppBundle\Extension; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; 
use Symfony\Component\HttpFoundation\Request; 
use Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\DoctrineParamConverter; 

/** 
* Put specific attribute parameter to query parameters 
*/ 
class QueryStringConverter extends DoctrineParamConverter { 

    protected function getIdentifier(Request $request, $options, $name) 
    { 
     if ($request->query->has($name)) { 
      return $request->query->get($name); 
     } 

     return false; 
    } 

} 

services.yml:

services: 
    querystring_paramconverter: 
    class: MBS\AppBundle\Extension\QueryStringConverter 
    arguments: ['@doctrine'] 
    tags: 
     - { name: request.param_converter, converter: querystring } 

в контроллере:

/** 
* @Route("/test") 
* @ParamConverter("myobject") 
*/ 
public function action(Request $request, AnyEntity $myobject) { 
    return new Response(print_r($myobject->getName(), true)); 
} 
Смежные вопросы