2009-05-20 13 views
24

E 'possibile chiamare la funzione membro di un altro controller in zend framework, se sì allora come?Chiamare la funzione membro di un altro controller nel framework zend?

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

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

Ecco un altro controller

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

spiegate in che modo posso accedere MemberFunction() dal secondo controller.

Soluzione

Meglio idea è di definire un AppController e rendere tutti i controllori usuali estendere AppController che si estende ulteriormente 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(); 
    } 
} 

Ora memberFunction può essere invocato dai controller estendono AppController come regola di semplice eredità.

+0

Solo una cronaca, ho sicuramente preferisco classi o moduli di configurazione condiviso quando ho bisogno di funzionalità comuni.Tuttavia, mi sono imbattuto in una situazione utilizzando ZF2, dove sarebbe stato molto utile utilizzare un AppController genitore esteso su un paio di altri controller. La tua soluzione ha funzionato bene. In ZF2 hai impostato: "la classe AppController estende AbstractActionController" e il controller figlio sarebbe lo stesso: "la classe FirstController estende AppController" So che ci sono modi migliori per farlo e probabilmente dovrei ripensare la struttura di alcune app, ma funziona. – gregthegeek

risposta

24

I controller non sono progettati per essere utilizzati in questo modo. Se si desidera eseguire un azione dell'altro regolatore dopo il controller corrente, utilizzare il metodo _forward():

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

Si noti che questo funziona solo per metodi d'azione (“memberAction”), non arbitrari funzioni membro!

Se SecondController::memberFunction() fa qualcosa che è necessario su più controller, mettilo in un helper di azione o in una classe di libreria, in modo che entrambi i controller possano accedere alla funzionalità condivisa senza dover dipendere l'uno dall'altro.

+0

grazie @Ferdinand, mi ha davvero aiutato !!! – Ish

+1

UPDATE 2015: $ this -> _ forward() è deprecato poiché ZF 1.7 - usa invece $ this-> forward(). –

+0

Hmmm, al momento della stesura di questo documento, i documenti [1.12] (http://framework.zend.com/manual/1.12/en/zend.controller.action.html) fanno ancora riferimento a _forward(). Ma hai ragione: il codice mostra chiaramente '_forward' come deprecato. Grazie! –

5

È consigliabile prendere in considerazione il codice in un helper di azione o nel modello in modo che possa essere chiamato da entrambi i controller che ne hanno bisogno.

saluti,

Rob ...

+0

Ottima risposta :) – kta

3

vorrei suggerire di seguire DRY e spostare le funzioni di luogo Libreria comune. Per esempio creare nella cartella della libreria

My/Util/ 

e file

CommonFunctions.php 

quindi chiamare la classe

My_Util_CommonFunctions 

e definire i metodi

Ora è possibile chiamare da qualsiasi luogo in il codice usando il tuo nuovo spazio dei nomi che devi registrare.

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

in qualsiasi controller è possibile chiamare i vostri metodi personalizzati utilizzando:

My_Util_CustomFunctions::yourCustomMethod($params); 
Problemi correlati