Как я могу расширить Zend_Controller_Action, чтобы сделать функцию универсальной во всех контроллерах - PullRequest
4 голосов
/ 10 сентября 2010

Я хочу расширить Zend_Controller_Action, чтобы обмен сообщениями был универсальным. Прямо сейчас в preDispatch () я устанавливаю все сообщения об ошибках и предупреждения. Как сделать функции AddMessage (см. Код) и preDispatch универсальными для всех контроллеров?

<?php

класс PlaygroundController расширяет Zend_Controller_Action {

public function init()
{
    /* Initialize action controller here */
}

public function preDispatch()
{
    $flashMessenger = $this->_helper->FlashMessenger;

    $flashMessenger->setNamespace('Errors');
    $this->view->Errors = $flashMessenger->getMessages();

    $flashMessenger->setNamespace('Warnings');
    $this->view->Warnings = $flashMessenger->getMessages();

    $flashMessenger->setNamespace('Messages');
    $this->view->Messages = $flashMessenger->getMessages();

    $flashMessenger->setNamespace('Success');
    $this->view->Success = $flashMessenger->getMessages();

}

protected function AddMessage($message,$type='Errors') {
    $flashMessenger = $this->_helper->FlashMessenger;
    $flashMessenger->setNamespace($type);
    $flashMessenger->addMessage($message);
}

public function flashAction()
{
    $this->AddMessage('This is an error message');
    $this->AddMessage('This is another error message');
    $this->AddMessage('This is a warning message','Warnings');
    $this->AddMessage('This is message','Messages');
    $this->AddMessage('This is another success message','Success');
}

}

Ответы [ 4 ]

2 голосов
/ 10 сентября 2010

Вы можете переместить эти два в модель и внедрить событие PreDispatch с помощью плагина Zend_Controller_Front.

2 голосов
/ 10 сентября 2010

У меня действительно нет опыта ZF, но я не могу представить, почему следующее не будет работать:

abstract class Zend_Controller_MyAction extends Zend_Controller_Action
{
  public function preDispatch()
  {
  ...
  }

  protected function addMessage ($message, $type='Errors')
  {
    ....
  }
  //... other common methods
}

Тогда ваш PlaygroundController будет расширяться Zend_Controller_MyAction вместо Zend_Controller_Action.

1 голос
/ 11 сентября 2010

Вы должны подкласс Zend_Controller_Action:

//library/My/Controller/Action.php
class My_Controller_Action extends Zend_Controller_Action
{
...
}

тогда

class IndexController extends My_Controller_Action
{
...
}

В качестве альтернативы вы можете поместить Zend Framework где-нибудь за пределами проекта, а затем перегрузить класс Zend_Controller_Action, поместив его в /library dir, который будет прочитан перед библиотекой Zend.

Ответив на ваш вопрос, я советую вам избегать этого.

В этом случае лучшим решением кажется написание пользовательского flashMessenger. Например. Взгляните на это:

Zend Framework: View Helper Priority Messenger | emanaton

1 голос
/ 10 сентября 2010

См. Мой связанный вопрос: Правильное расположение для пользовательского Zend_Action_Controller

Я только что закончил ставить его под library/APPNAMESAPCE/Action/Contoller и добавить в application.ini:

autoloadernamespaces.APPNAMESPACE = "APPNAMESPACE_"
appnamespace = "APPNAMESPACE_"

Очевидно, APPNAMESPACE должно быть заменено моим пространством имен вашего приложения. У вас уже должна быть вторая строка для автозагрузки моделей / форм / и т. Д.

Я также использую library/APPNAMESPACE/ для любых других специфичных для приложения подклассов стандартных классов Zend Framework.

Обновление : Использование заглушки было предложено, и, безусловно, кажется хорошей идеей для этого варианта использования. Угадайте, где я храню плагины для своего приложения?

library/APPNAMESPACE/Action/Contoller/Plugin

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

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