Вызов функции-члена другого контроллера в рамках Zend? - PullRequest
24 голосов
/ 20 мая 2009

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

<?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 как правило простого наследования.

Ответы [ 3 ]

25 голосов
/ 20 мая 2009

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

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

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

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

5 голосов
/ 20 мая 2009

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

С уважением,

Rob ...

3 голосов
/ 24 сентября 2012

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

My/Util/ 

и файл

CommonFunctions.php

тогда позвоните своему классу

My_Util_CommonFunctions

и определите ваши методы

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

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

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

My_Util_CustomFunctions::yourCustomMethod($params);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...