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


person Ish    schedule 20.05.2009    source источник
comment
Просто к сведению, я определенно предпочитаю настраивать общие классы или модули, когда мне нужны общие функции. Однако при использовании ZF2 я столкнулся с одной ситуацией, когда было бы весьма полезно использовать родительский AppController, расширенный на пару других контроллеров. Ваше решение сработало хорошо. В ZF2 вы настраиваете: класс AppController расширяет AbstractActionController, и дочерний контроллер будет таким же: класс FirstController расширяет AppController Я знаю, что есть лучшие способы сделать это, и мне, вероятно, следует переосмыслить некоторую структуру приложения, но она работает.   -  person gregthegeek    schedule 09.11.2013


Ответы (3)


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

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

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

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

person Ferdinand Beyer    schedule 20.05.2009
comment
ОБНОВЛЕНИЕ 2015: $ this - ›_ forward () устарело с ZF 1.7 - вместо этого используйте $ this-› forward (). - person Stephan Weinhold; 15.06.2015
comment
Хммм, на момент написания статьи 1.12 все еще ссылка на _forward (). Но вы правы: код ясно показывает _forward как устаревший. Спасибо! - person David Weinraub; 15.11.2015

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

С уважением,

Роб ...

person Rob Allen    schedule 20.05.2009

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

My/Util/ 

и файл

CommonFunctions.php

тогда позвони в свой класс

My_Util_CommonFunctions

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

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

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

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

My_Util_CustomFunctions::yourCustomMethod($params);
person Mike Walkowiak    schedule 24.09.2012