2009-10-30 12 views
21

Me gustaría que alguien me explique lo que _forward está haciendo exactamente, no puedo ver si _forward también muestra la vista adjunta a la acción o simplemente ejecuta la acción.

¿También es posible pasar argumentos a $ this-> action en un script de vista?

De manera más general, mi problema es cómo codificar una página de confirmación, digamos que el usuario ingresó algunas cosas y desea mostrarle la confirmación, ¿es eso lo que está buscando? (Métodos de utilidad 12.7.6.)

+0

@jldupont gracias por la etiqueta editar olvidado php ^^ – RageZ

+0

He añadido algunas palabras a mi pregunta – RageZ

Respuesta

22

_forward es una redirección interna. Mientras que _redirect envía un encabezado que indica al navegador del cliente que vaya a otra URL, _forward le dice al despachador que redirija la solicitud internamente a otra parte.

Si se tiene en cuenta el orden de despacho normal de:

preDispatch() 
someAction() 
postDispatch() 

Calling _forward en cualquier punto en que la progresión hará que los siguientes pasos para no ser ejecutado. Por lo tanto, si llama a _forward en preDispatch(), no se invocará alguna Action() y así sucesivamente. Si _foreward() en someAction() y está usando viewRenderer action helper para renderizar sus vistas (está dejando que el framework elija qué script ver para representar), entonces no se representará ningún script de vista en someAction().

Cuando la solicitud se reenvía al nuevo Controlador/Módulo, todo el proceso de envío se repetirá allí.

Usted puede averiguar lo que está siendo enviado acción mediante el uso de:

$action = $this->getRequest()->getParam('action'); 

$ acción será la forma url de la acción por lo que si el método es el nombre de someKindOfAction ', la acción $ contendrá 'algu- mas o menos'. Puede hacer esto también para controladores y módulos.

9

Mi experiencia con Zend es limitada y espero que no te estoy mostrando algo que ya ha visto, pero according to the docs:

_forward ($ action, $ controller = null, $ module = null, array $ params = null): realiza otra acción. Si se llama en preDispatch(), la acción solicitada actualmente se omitirá a favor de la nueva. De lo contrario, una vez procesada la acción actual, se ejecutará la acción solicitada en _forward().

Parece el contexto de cuándo se llama. En este último caso, primero ejecutará la acción desde la que se ha llamado y luego ejecutará la acción reenviada. La excepción es cuando se llama desde el preDispatch controlador

+0

karim gracias por la respuesta, pero he encontrado pocos casos que las cosas no estaban haciendo lo que esperaba ... además encuentro el doc (al menos) este tipo de misterioso. también qué sucede si llamo $ this-> forward y ya estoy en acción – RageZ

2

Una parte de los documentos del Framework que juro solía estar allí explicaba el flujo de trabajo de despacho a nivel general. Hay this diagram, pero es terriblemente complicado explicar lo que hace _forward.

En una acción _foreward establecerá $request->isDispatched = false, y configurará la solicitud para llamar al controlador/acción especificada en _forward. Durante postDispatch, isDispatched está marcado; si es falso, todo vuelve a funcionar con la nueva solicitud.

Así que ... Si en su acción está renderizando vistas manualmente, seguirán mostrándose. Todo en la acción todavía sucederá, es solo otra acción TAMBIÉN sucederá después.

[editar después de la pregunta editar]

Adelante no es para la respuesta y/o confirmar -después de post - utilizar un redireccionamiento para eso. $this->_helper->redirector->gotoUrl() etc.

+2

Esa imagen de diagrama ahora falla. – leek

3

El reenvío se utilizará cuando la redirección externa no sea la correcta. Caso de uso (un poco incómodo, pero lo mejor que puedo inventar): Tiene un formulario que puede agregar a su mascota (ya sea perro o gato). Tienes diferentes modelos para cada uno. Usted incluye un seleccionar en su formulario para seleccionar perro/gato. Luego en su acción lo hace:

if($form->isValid($_POST)){ 
    switch($form->select->getValue()){ 
    case "dog": 
     $this->_forward('add-dog','pets','default'); 
     break; 
    case "cat": 
     $this->_forward('add-cat','pets','default'); 
     break;  
    } 
} 

Y maneja diferentes cosas para perros y gatos en acciones separadas. La ventaja de esto es que TODOS los parámetros se envían a lo largo. En contraste, cuando utilizó $ this -> _ redirect() los parámetros de POST se perderán. En algunos casos, se trata de un comportamiento intencionado (por ejemplo, después de agregar un comentario se hace una redirección a la página de lista de comentarios para evitar publicaciones dobles y el mensaje "la página necesita enviar datos otra vez ..."

9

Creo que es importante tenga en cuenta que _forward es muy ineficiente, y siempre debe llamar a su método directamente. Cuando hace un _forward, el init(), pre y post dispatch se ejecutan nuevamente. Dependiendo de lo que tenga en su init, puede ejecutar (e insertar) el mismo registro de la base de datos dos veces

Es fácil de usar, pero desperdicia.Si perfila su código, y se está golpeando la cabeza con el motivo por el que todo se llama dos veces, _en adelante es la razón. Si me gusta y crea una instancia pocos objetos en el init() para usar en toda la clase, terminas instanciando todo t ¡Wice! Cargué las pruebas en mi código y obtuve un mejor rendimiento al llamar directamente al nombre de la acción, como foo(), en lugar de _forward ('foo');

Otro consejo fuera del tema Creo que la mayoría de la gente sabe, es usar comillas simples siempre que sea posible, ya que el analizador PHP tiene que verificar una cadena para variables incrustadas. No sé cuánto rendimiento real dará, especialmente si está utilizando un caché de código de operación, pero es una buena práctica.

+0

Veo tu punto con el envío se ejecutó de nuevo, las únicas cosas cuando quieres reenviar en el mismo controlador llamar al método directamente es mejor, pero cuando es un controlador diferente, probablemente tienes que inicializar muchas cosas a mano, es decir '$ this- > _request' – RageZ

+0

y en mi caso lo uso también para fines de verificación de inicio de sesión, es decir, esa página debe autenticarse pero no lo está, mostrar la página de inicio de sesión ... y mi código de inicio de sesión/cierre de sesión siempre está en un controlador separado (en la mayoría case) – RageZ

+0

Dan, creo que su afirmación es parcialmente incorrecta: "Cuando haces un _forward, el init(), pre y post dispatch se ejecutan nuevamente. Dependiendo de lo que tengas en tu init, puedes ejecutar (e insertar) el mismo registro de la base de datos dos veces ". En realidad, init se llama una sola vez, en el construtor ... sin embargo, el envío previo y posterior se llaman varias veces. – joedevon

Cuestiones relacionadas