2010-02-02 14 views
28

Creo que el orden de ejecución es init(), se llama a preDispatch() y luego a action().Zend Framework: ¿Cuáles son las diferencias entre las funciones init() y preDispatch() en los objetos del controlador?

  1. ¿Debo inicializar mi variables, que son comunes entre todas las acciones, en init() o preDispatch()? He visto gente usando ambas funciones para la inicialización. Probablemente, como su nombre lo sugiere, debería hacerse en init(), pero ¿qué tipo de cosas iría en preDispatch()?

  2. ¿Qué ocurre entre las llamadas a funciones init() y preDispatch()?

+0

¿Estás hablando de objetos del controlador? –

+0

@Emil: he editado la pregunta. Debería estar claro ahora. – understack

Respuesta

28

Primera preDispatch() se llama para las instancias de Zend_Controller_Plugin_Abstract. Aquí tiene los objetos de solicitud y respuesta, por lo que puede filtrar la solicitud o hacer alguna preparación utilizando la información de la solicitud.

init() del Zend_Controller_Action se denomina siguiente como parte del constructor. Está ahí para ayudarlo a inicializar su controlador, sin tener que anular y repetir la firma del constructor (Zend_Controller_Action::__contruct()).

El método preDispatch() del controlador se llama aquí. Puede llamar $request->setDispatched(false) para omitir la acción actual - no estoy seguro si se puede hacer eso en init()

Luego, su método de acción se llama (viewAction() por ejemplo). Aquí realiza su trabajo normal, como recuperar elementos del modelo y poblar la vista.

Así la distinción ahora debería estar claro:

  • Si quieres algo que debe ejecutarse antes de que todas las acciones - la puso en un plugin y utilizar uno de los ganchos (además preDispatch() hay routeStartup y others),
  • si quieres antes de cada acción en un controlador - init o preDispatch(),
  • aunque sólo sea por una sola acción - la acción misma.

lo que sucede entre las llamadas init() y preDispatch() función?

Casi nada - preDispatch() se ejecuta, y si no se ha llamado $request->setDispatched(false), se ejecuta la acción.

+0

Consulte también http://framework.zend.com/manual/en/zend.controller.plugins.html – Gordon

+2

'si desea antes de cada acción en un controlador - init o preDispatch()' De hecho, no ha respondido la pregunta en si misma Desde el punto de vista estructural, ** en controladores individuales **, cuando debe usarse init() en lugar de preDispatch() (no complementos)? Por ejemplo: nunca vemos que el auxiliar AjaxContext se utilice en preDispatch, pero init(). Entonces, ¿cuál es la diferencia conceptual entre los dos? No es técnico Si entiendes lo que quiero decir Si simplemente puede usar uno u otro, no hay diferencia. Pero creo que hay algo. –

+0

Solo un consejo sobre 'ajaxContext' Me refiero a los documentos cuando vemos los ejemplos en controladores únicos: http://framework.zend.com/manual/en/zend.controller.actionhelpers.html#zend.controller .actionhelpers.contextswitch.ajaxcontext –

0

init(): Cargado antes de las funciones, Por lo tanto, si desea cargarlo antes de todas las funciones del proyecto, póngalo en la clase de arranque. Si antes de una clase especificada funciona, póngala en init() esta función de clase.

preDispatch(): Cargado antes del controlador frontal.

9
  • El método init() está destinado principalmente a extender el constructor. Normalmente, su constructor simplemente debe establecer el estado del objeto y no realizar mucha lógica. Esto podría incluir la inicialización de los recursos utilizados en el controlador (como modelos, objetos de configuración, etc.), o la asignación de valores recuperados del controlador frontal, bootstrap o un registro.

  • El método preDispatch() también se puede usar para establecer el estado del objeto o entorno (por ejemplo, vista, ayuda de acción, etc.), pero su objetivo principal es tomar decisiones sobre si se debe enviar o no la acción solicitada. Si no es así, entonces debe _forward a otra acción o lanzar una excepción.


Nota: _forward realidad no funcionará correctamente cuando se ejecuta desde init(), que es una formalización de las intenciones de los dos métodos.

Cuestiones relacionadas