Можно ли вызвать функцию-член другого контроллера в рамках 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
как правило, простого наследования.
Контроллеры не предназначены для использования таким образом. Если вы хотите выполнить действие другого контроллера после текущего контроллера, используйте метод _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);