2009-05-20 26 views
24

¿Es posible llamar a la función miembro de otro controlador en zend framework? Si es así, ¿cómo?Función de miembro llamante de otro controlador en zend framework?

<?php 
class FirstController extends Zend_Controller_Action { 
    public function indexAction() { 
     // general action 
    } 

    public function memberFunction() { 
     // a resuable function 
    } 
} 

Aquí hay otro controlador

<?php 
class SecondController extends Zend_Controller_Action { 
    public indexAction() { 
     // here i need to call memberFunction() of FirstController 
    } 
} 

Por favor, explique cómo puedo acceder memberFunction() del segundo controlador.

Solución

mejor idea es definir un AppController y hacer que todos los controladores habituales para extender AppController que se extiende más Zend_Controller_Action.

class AppController extends Zend_Controller_Action { 
    public function memberFunction() { 
     // a resuable function 
    } 
} 

class FirstController extends AppController { 
    public function indexAction() { 
     // call function from any child class 
     $this->memberFunction(); 
    } 
} 

Ahora memberFunction se puede invocar desde los controladores que se extienden AppController como regla de la herencia simple.

+0

Como digo, definitivamente prefieren clases o módulos de configuración compartida cuando necesito una funcionalidad común.Sin embargo, me encontré con una situación usando ZF2, donde sería bastante útil usar un AppController principal que se extiende a otros dos controladores. Tu solución funcionó bien. En ZF2 configura: "AppController clase extiende AbstractActionController" y el controlador hijo sería el mismo: "clase FirstController extends AppController" Sé que hay mejores formas de hacerlo y probablemente debería replantear la estructura de algunas aplicaciones, pero funciona. – gregthegeek

Respuesta

24

Los controladores no están diseñados para usarse de esa manera. Si desea ejecutar una acción del otro controlador después su controlador actual, utilice el _forward() método:

// Invokes SecondController::otherActionAction() after the current action has been finished. 
$this->_forward('other-action', 'second'); 

Tenga en cuenta que esto sólo funciona para métodos de acción (“memberAction”), no es arbitraria funciones miembro!

Si SecondController::memberFunction() hace algo que se necesita a través de múltiples controladores, coloque ese código en una acción auxiliar o clase de biblioteca, para que ambos controladores puedan acceder a la funcionalidad compartida sin tener que depender el uno del otro.

+0

gracias @Ferdinand, ¡realmente me ayudó! – Ish

+1

ACTUALIZACIÓN 2015: $ this -> _ forward() está en desuso desde ZF 1.7 - use $ this-> forward() en su lugar. –

+0

Hmmm, al momento de escribir este documento, los documentos [1.12] (http://framework.zend.com/manual/1.12/en/zend.controller.action.html) aún hacen referencia a _forward(). Pero tiene razón: el código muestra claramente '_forward' como obsoleto. ¡Gracias! –

5

Debería considerar el factorizar el código en un asistente de acción o en su modelo para que pueda ser llamado desde los dos controladores que lo necesiten.

Saludos,

Rob ...

+0

Excelente respuesta :) – kta

3

que sugeriría que siga seco y mover esas funciones al lugar común de la biblioteca. Por ejemplo crear en la carpeta de la biblioteca

My/Util/ 

y presentar

CommonFunctions.php 

luego llame a su clase

My_Util_CommonFunctions 

y definir sus métodos

Ahora se les puede llamar desde cualquier lugar el código que usa su nuevo espacio de nombres que debe registrar.

$loader = Zend_Loader_Autoloader::getInstance(); 
$loader->registerNamespace(array('My_')); 

en cualquier controlador puede llamar a sus métodos personalizados mediante el uso de:

My_Util_CustomFunctions::yourCustomMethod($params); 
Cuestiones relacionadas