php - mac - zend framework pdf
Zend Framework, lo que $ this->_forward está haciendo (5)
Creo que es importante tener en cuenta que _forward es muy ineficiente, y siempre debes llamar a tu método directamente. Cuando haces 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 derrochador. Si perfila su código y se está golpeando la cabeza con el motivo por el que se llama a todo dos veces, _el avance es la razón. Si le gusto y crea instancias de algunos objetos en el init () para usar en toda la clase, ¡terminará instanciando todo dos veces! 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 las 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.
Me gustaría que alguien me explique qué es lo que _foreward 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á por venir?
El reenvío se usará cuando la redirección externa no sea la opción correcta. Caso de uso (un poco incómodo, pero lo mejor que puedo inventar): tienes un formulario que puede agregar a tu 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 tu acción lo haces:
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 manejas diferentes cosas para gatos y perros 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, hace una redirección a la página de la lista de comentarios para evitar el doble de publicaciones y el mensaje "la página debe enviar datos de nuevo ...".
Mi experiencia con Zend es limitada y espero no mostrarle algo que ya haya visto, pero de acuerdo con los documentos (12.7.6. Métodos de utilidad):
_forward ($ action, $ controller = null, $ module = null, array $ params = null): realiza otra acción. Si se llama a preDispatch (), la acción solicitada actualmente se saltará a favor de la nueva. De lo contrario, después de que se procese la acción actual, se ejecutará la acción solicitada en _forward ().
Entonces suena como el contexto de cuando se llama materia. 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 controlador preDispatch
Una parte de los documentos del Framework que juro solía estar allí explicaba el flujo de trabajo de despacho a nivel general. Este es el diagrama , pero es terriblemente complicado explicar lo que hace hacia adelante.
Cuando se encuentre en una acción _forward 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.
Entonces ... Si en su acción está renderizando vistas de forma manual, 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 editar la pregunta]
Reenviar no está diseñado para la respuesta / confirmación después de la publicación: use una redirección para eso. $this->_helper->redirector->gotoUrl()
etc.
_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 considera la orden de envío normal de:
preDispatch()
someAction()
postDispatch()
Llamar _forward en cualquier punto de esa progresión hará que los siguientes pasos no se ejecuten. Por lo tanto, si llama _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 despacho se repetirá allí.
Puede averiguar qué acción se está enviando al usar:
$action = $this->getRequest()->getParam(''action'');
$ action será la forma url de la acción, de modo que si el método es name ''someKindOfAction'', $ action contendrá ''some-kind-of''. Puede hacer esto también para controladores y módulos.