2012-01-03 29 views
11

¿Es posible reenviar una solicitud, pasando por todos los parámetros GET/POST?Symfony 2 Reenviar solicitud pasando por los parámetros GET/POST

creo que si acabo de hacer

$this->forward('dest') 

voy a ir a dest sin parametros GET/POST?

ACTUALIZACIÓN

Mi objetivo es en realidad para tener una acción del controlador como addSomething que lleva comprueba que el usuario tiene los "elementos" suficientes para añadir algo. A continuación, reenvíe la solicitud al controlador apropiado para continuar la adición real de agregar {Tipo} Algo

¿O sería más apropiado un servicio de "comprobación" en todos los controladores que hace la verificación? De todas formas, creo que es informativo para saber cómo reenviar a una acción del controlador con toda params

Respuesta

15

no veo ninguna razón para reenviar la solicitud a través del núcleo. Puede seguir la ruta de encapsular esta lógica en un servicio de comprobación, como ha sugerido, o puede crear un escucha kernel.request que se ejecuta después del escucha del enrutador y aplica el atributo _controller solo si se cumplen sus condiciones.

Por ejemplo, este routing.yml:

some_route: 
    pattern: /xyz 
    defaults: { _controller_candidate: "FooBundle:Bar:baz" } 

Y esta oyente:

class MyListener 
{ 
    public function onKernelRequest($event) 
    { 
     $request = $event->getRequest(); 
     if (!$controller = $request->attributes->get('_controller_candidiate')) { 
      return; 
     } 

     if (/* your logic... */) { 
      $request->attributes->set('_controller', $controller'); 
     } 
    } 
} 

configurado para ejecutarse después el oyente router de núcleo:

services: 
    my_listener: 
     class: MyListener 
     tags: 
      - 
       name:  kernel.event_listener 
       event: kernel.request 
       priority: -10 

La prioridad de la el oyente del enrutador principal es 0 en Symfony 2.0 y 32 en Symfony 2.1. En cualquier caso, una prioridad de -10 debería funcionar.

Tengo curiosidad por ver si esto funciona :) "atributos de la petición"

+0

Parece que funciona. Actualizaré si funciona después de probarlo más tarde. Si quiero hacer lo contrario, ejecutar algo después de una acción de controlador, ¿hay algún evento similar? ¿Cómo averiguas acerca de estos métodos aparentemente indocumentados? –

+0

Ok, encontré mi respuesta http://symfony.com/doc/2.0/book/internals.html#handling-requests. ¿Te preguntas cuál es el método correcto para usar? 'kernel.response'? –

+0

Oh, yo uso la anotación '@ Route', ¿cómo puedo modificar' $ request-> attributes-> get ('_ controller_candidiate') '? –

27

solución más fácil (y uno que probablemente iría a) sería sólo tiene que pasar la clase de solicitud como parámetro adelante

public function indexAction() 
{ 
    $request = $this->getRequest(); 

    return $this->forward('AcmeBundle:Forward:new', array('request' => $request)); 
} 

Y en la acción remitido simplemente lo utilizan como parámetro método:

public function testAction($request) 
{ 
    var_dump($request);exit; 
} 
+4

PERO ... que podría ser un problema cuando se juega con las formas - si tanto la acción (el 'reenvío' y el 'remitida a') tienen formas con envíos, caerá en una trampa: la acción 'reenviada a' ve el formulario $ _POST del controlador anterior, por lo que se bloquea en el token CSRF (inválido, del formulario anterior. – thorinkor

+0

@thorinkor ¿Existe una forma válida de evitarlo? ¿Regenerando de alguna manera? Intenté con el servicio security.csrf.token_manager y getToken() pero sin suerte. – userfuser

+0

@userfuser la mejor solución - evitarlo :) Tal vez podrías intentar obtenerlo desde la primera solicitud de formulario y volver a enviarlo en el método de reenvío. – thorinkor

0

Forwarding como "camino" funciona para mí:

public function indexAction() 
{ 
    $path = $this->getRequest()->attributes->all(); 
    return $this->forward('CompMyBundle:MyController:MyAction', $path); 
} 

$ ruta [ '_ controlador'] se sobrescribe en método forward()!

7

Todos los parámetros POST se envían automáticamente. No se necesita ninguna acción para tener POST param en el controlador objetivo. Pero debe pasar explícitamente parámetros de búsqueda (GET) y parámetros de ruta. El método forward toma 2 parámetros opcionales que representan respectivamente las matrices pathParam y queryParam.Que sólo puede pasar todo el parámetro de consulta de la petición actual

public testAction(Request $request){ 
    $pathParam = array(); //Specified path param if you have some 
    $queryParam = $request->query->all(); 
    $response = $this->forward("AcmeBundle:Forward:new", $pathParam, $queryParam); 
} 
+0

la mejor respuesta a la pregunta original – Black