Вызов функции-члена другого контроллера в рамках zend?

Можно ли вызвать функцию-член другого контроллера в рамках zend, если да, то как?

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

Вот еще один контроллер

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

Пожалуйста, объясните, как я могу получить доступ к функции memberFunction () со второго контроллера.

Решение

Лучшая идея – определить AppController и сделать все обычные контроллеры для расширения AppController, который расширяет 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(); } } 

Теперь memberFunction можно вызвать из контроллеров, расширяющих AppController как правило, простого наследования.

Solutions Collecting From Web of "Вызов функции-члена другого контроллера в рамках zend?"

Контроллеры не предназначены для использования таким образом. Если вы хотите выполнить действие другого контроллера после текущего контроллера, используйте метод _forward() :

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

Обратите внимание, что это работает только для методов действий ("memberAction"), а не для произвольных функций-членов!

Если SecondController::memberFunction() делает что-то, что необходимо для нескольких контроллеров, поместите этот код в помощник или библиотечный класс, чтобы оба контроллера могли получить доступ к общим функциям, не завися друг от друга.

Вы должны подумать о том, чтобы разложить код на помощник действия или на вашу модель, чтобы его можно было вызывать из обоих контроллеров, которые в ней нуждаются.

С Уважением,

Роб …

Я предлагаю вам следовать DRY и перенести эти функции на место общей библиотеки. Например, создайте в папке библиотеки

 My/Util/ 

и файл

 CommonFunctions.php 

затем позвоните в свой класс

 My_Util_CommonFunctions 

и определите свои методы

Теперь вы можете вызывать их из любого места в коде, используя новое пространство имен, которое вы должны зарегистрировать.

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

в любом контроллере вы можете вызвать свои собственные методы, используя:

 My_Util_CustomFunctions::yourCustomMethod($params);