Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calling member function of other controller in zend framework?

Is it possible to call the member function of another controller in zend framework, if yes then how?

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

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

Here's another controller

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

Please explain how i can access memberFunction() from second controller.

Solution

Better idea is to define a AppController and make all usual controllers to extend AppController which further extends 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();
    } 
}

Now memberFunction can be invoked from controllers extending AppController as a rule of simple inheritance.

like image 210
Ish Avatar asked May 20 '09 05:05

Ish


3 Answers

Controllers aren't designed to be used in that way. If you want to execute an action of the other controller after your current controller, use the _forward() method:

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

Note that this only works for action methods (“memberAction”), not arbitrary member functions!

If SecondController::memberFunction() does something that is needed across multiple controllers, put that code in a action helper or library class, so that both controllers can access the shared functionality without having to depend on each other.

like image 71
Ferdinand Beyer Avatar answered Nov 16 '22 17:11

Ferdinand Beyer


You should consider factoring out the code into either an action helper or to your model so that it can be called from both controllers that need it.

Regards,

Rob...

like image 31
Rob Allen Avatar answered Nov 16 '22 17:11

Rob Allen


I would suggest you to follow DRY and move those functions to common library place. For example create in library folder

My/Util/ 

and file

CommonFunctions.php

then call your class

My_Util_CommonFunctions

and define your methods

Now you can call them from any place in the code using your new namespace which you have to register.

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

in any controller you can call your custom methods by using:

My_Util_CustomFunctions::yourCustomMethod($params);
like image 37
Mike Walkowiak Avatar answered Nov 16 '22 16:11

Mike Walkowiak