2010-03-31 11 views

Respuesta

51

_forward() sólo hacia delante todo a otra acción del controlador, mientras que _redirect() remata de cabeza, lo que significa que crear una nueva solicitud HTTP y va a través de todo el proceso de despacho con él.

Por ejemplo, si se llama a http://example.com/foo/bar que se podría llamar el controlador foo y bar acción. Si reenvía dentro de la acción bar a la acción baz, p. dentro de la misma solicitud, el navegador aún estaría en la misma URL, mientras que al hacer una redirección, ZF le indicaría al navegador que cargue http://example.com/foo/baz.

Esencialmente, _forward() hace

$request->setActionName($action) 
     ->setDispatched(false); 

mientras _redirect() hace

$this->_helper->redirector->gotoUrl($url, $options); 

que suele hacer redirecciones cuando quiero evitar que vuelva a cargar una página que resulta en volver a colocar los datos del formulario.

Vea éstas:

2

Supongo que una redirección envía un 301/302 de vuelta al navegador con una nueva URL, mientras que un reenvío simplemente "reenvía" la solicitud a una acción de controlador diferente internamente pero mantiene la URL igual para que el navegador no lo haga t saber algo diferente.

0

La acción de redirección termina el proceso de página actual y vuelve a dirigir a otro. Todo el contexto cambiará (nuevo controlador/acción) a medida que el navegador recibe una redirección. Se conecta a una nueva URL

Considerando que el reenvío permanecerá en la misma página, pero no modificará el contexto. Puedes ver esto como una llamada a función. Sus vistas se cargarán como de costumbre.

1

1-redirect crear una nueva respuesta con header() de la información [302 encontrado o 301 == movido permanentemente] y su va a llegar al ciclo de expedición una vez más

cambio

2-forward el flujo de ejecución a ese nuevo solicitud sin volver a entrar en el proceso de despacho de nuevo

4

que usaría _forward() para los casos en que desea que la URL para suspender el mismo - aunque tenga cuidado , significa cualquier clase controlador base que está utilizando se llama dos veces.

Esto puede parecer obvio o trivial, pero si no se tiene en cuenta, realmente puede arruinar el diseño de la aplicación, dado que la comprensión intuitiva del flujo es que una solicitud llama a una instancia de controlador. P.ej. significa que los singletons de ámbito de solicitud tienen para declararse como static, o _forward() los romperán.

68

Imagine que recibe una llamada telefónica en la oficina. Alguien quiere hablar de ventas. Si dice "por favor llame al 123456" y cuelgue, esto es redirigir. Si dice "espere un minuto" y simplemente transfiere la llamada a ellos, esto es adelante. ;)

+12

Si los pones en espera y te olvidas de ellos, ¿se trata de un ciclo infinito? –

+1

@Tim Fountain He estado atrapado en ese circuito con Time Warner Cable durante 15 años. – kenitech

Cuestiones relacionadas