Подтвердить что ты не робот

Вызов функции-члена другого контроллера в рамках 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 как правило простого наследования.

4b9b3361

Ответ 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);