Как запустить одинаковые строки во всех контроллерах init ()? - PullRequest
3 голосов
/ 18 февраля 2011

Мне нужны одинаковые 2 строки во всех моих контроллерах, каждый контроллер имеет свою собственную логику инициализации, но эти две строки являются общими для всех них.

public function init()
{
    $fm =$this->_helper->getHelper('FlashMessenger');
    $this->view->messages = $fm->getMessages();
}

Как мне избежать повторения кода?

Обновление:

Хорошо, FlashMessenger был только примером, скажем, мне нужно писать строку журнала в каждом действии, кроме 'someAction' @ 'someController'. Таким образом, новые общие линии должны быть.

$this->logger = new Zend_Log();
$writer = new Zend_Log_Writer_Stream(APPLICATION_PATH.'/../logs/log.txt');
$this->logger->addWriter($writer);
$this->logger->log('Some Message',Zend_Log::DEBUG);

Вопрос в том, куда мне поместить эти строки, чтобы избежать их повторения во всех init () каждого контроллера. Эти строки должны быть размещены в начальной загрузке? Если так: Как пропустить строки журнала для 'someAction'. Или я должен реализовать BaseController и сделать так, чтобы все мои контроллеры расширялись от него. Если так: как я могу это загрузить? (Неустранимая ошибка: класс BaseController не найден).

Ответы [ 5 ]

6 голосов
/ 19 февраля 2011

Просто подкласс контроллера:

class Application_ControllerAction extends Zend_Controller_Action {
    public function init()
    {
        $fm =$this->_helper->getHelper('FlashMessenger');
        $this->view->messages = $fm->getMessages();
    }
}


class IndexController extends Application_ControllerAction {
}

Вы также можете получить тот же плагин Controller для записи.

Edit:

Плагины фронт-контроллера выполняются при каждом запросе, как и Controllers, и имеют те же методы перехвата:

routeStartup(): prior to routing the request
routeShutdown(): after routing the request
dispatchLoopStartup(): prior to entering the dispatch loop
preDispatch(): prior to dispatching an individual action
postDispatch(): after dispatching an individual action
dispatchLoopShutdown(): after completing the dispatch loop

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

if ('admin' == $this->getRequest()->getModuleName() 
&& 'update' == $this->getRequest()->getActionName() ) …
1 голос
/ 18 февраля 2011

Вы можете получить доступ к своим флеш-сообщениям через (вам не нужно отправлять что-либо с вашего контроллера на просмотр, все автоматизировано)

$fm = new Zend_Controller_Action_Helper_FlashMessenger();
Zend_Debug::dump($fm->getMessages());

по вашему мнению, я бы также рекомендовал инкапсулировать этот код в помощник вида, как показано на этом сайте http://grummfy.be/blog/191

0 голосов
/ 19 февраля 2011

В вашей начальной загрузке:

protected function _initMyActionHelpers() {
    $fm = new My_Controller_Action_Helper_FlashMessenger();
    Zend_Controller_Action_HelperBroker::addHelper($fm);;
}
0 голосов
/ 19 февраля 2011

Это не причина для создания нового пользовательского контроллера. Просто добавьте эту строку ко всем методам init ().

$this->view->messages = $this->_helper->getHelper('FlashMessenger')->getMessages();
0 голосов
/ 18 февраля 2011

Как мне избежать повторения кода?

Напишите собственный настраиваемый контроллер, внедрите его в метод init этого контроллера, а затем расширьте все контроллеры в вашем приложении из настраиваемого контроллера.

Но подход с отдельным помощником вида, как упомянул @Jeff (посмотрите на ссылку), часто принимается как лучшее решение. В вашем контроллере делайте только:

$this->_helper->flashMessanger('My message');

, а помощник вида сделает все остальное.

...