Вызов функции-члена другого контроллера в рамках 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
как правило простого наследования.
Ответы
Ответ 1
Контроллеры не предназначены для использования таким образом. Если вы хотите выполнить действие другого контроллера после текущего контроллера, используйте метод _forward()
:
// Invokes SecondController::otherActionAction() after the current action has been finished.
$this->_forward('other-action', 'second');
Обратите внимание, что это работает только для методов действий ( "memberAction" ), а не для произвольных функций-членов!
Если SecondController::memberFunction()
делает что-то, что необходимо для нескольких контроллеров, поместите этот код в помощник или класс библиотеки, чтобы оба контроллера могли получить доступ к общим функциям, не завися друг от друга.
Ответ 2
Вы должны подумать о том, чтобы разложить код на помощник действия или на вашу модель, чтобы его можно было вызывать из обоих контроллеров, которые в ней нуждаются.
Привет,
Rob...
Ответ 3
Я предлагаю вам следовать DRY и переместить эти функции в общую библиотечную папку. Например, создайте в папке библиотеки
My/Util/
и файл
CommonFunctions.php
затем вызовите класс
My_Util_CommonFunctions
и определите свои методы
Теперь вы можете вызывать их из любого места в коде, используя новое пространство имен, которое вы должны зарегистрировать.
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace(array('My_'));
в любом контроллере вы можете вызвать свои собственные методы, используя:
My_Util_CustomFunctions::yourCustomMethod($params);