Как обрабатывать Zend_Exception в preDispatch или init действия при использовании базового контроллера? - PullRequest
3 голосов
/ 23 сентября 2010

Как упомянуто в руководстве Zend Framework , я создал базовый контроллер.

Подклассы контроллера действий

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

Помимо создания полезных функций для ваших веб-приложений, вы также можете обнаружить, что вы повторяете большую часть тех же самых методов установки или служебных методов вваши различные контроллеры;если это так, то создание общего базового класса контроллера, расширяющего Zend_Controller_Action, может решить такую ​​избыточность.

Но оказывается, что исключения не вызываются должным образом из базы ... Чтобы воспроизвести это, создайтеfile:

/ path / to / workspace / library / Joe / Controller.php

Затем:

class Joe_Controller extends Zend_Controller_Action
{
    public function init()
    {
        Throw new Zend_Exception('test', 500);
        parent::init();
    }
}

Затем в каталоге вашего контроллера IndexController.php расширяетсяthe base:

class IndexController extends Joe_Controller
{

Вы обнаружите, что исключение необработано.

Если, тем не менее, вы не расширяете базовый контроллер, а затем сгенерируйте исключение в init или preDispatch, онобудет перехвачен и отправлен на ErrorController.

У кого-нибудь есть идеи по получению исключений, перехваченных из базового контроллера?

Спасибо.

ОБНОВЛЕНИЕ ДЛЯ ЭТОГО РЕШЕНИЯДРУГОЙ ПУТЬ

Изучив различные статьи и официальную документацию о том, как структурировать каталоги, я решил поместить базовый контроллер в библиотеку / Joe / ... номожет быть, это часть проблемы ... в руководстве нет руководства о том, как назвать и разместить базовый контроллер.Что делают эксперты с базовым контроллером?

Еще одно обновление

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

абстрактный класс Joe_Controller_Action расширяет Zend_Controller_Action.

За исключением изменения, это не решило проблему ...

Теперь, учитывая, что есть статьи, предлагающие использовать базовые контроллеры, включая руководствоБудет ли это рассматриваться как ошибка в Zend Framework?

Для репликации просто добавьте исключение Zend_Exception любого типа в базовый init или preDispatch.Представьте, что вы опрашиваете базу данных там (что я и делаю) ... и база данных не работает.Нет ошибок контроллера.Это не очень хорошая ситуация, если я что-то не так делаю.

Я подозреваю, что это новая ошибка ... Я не помню эту проблему до Zend_Application, и с тех пор я использую базовый контроллерZF 1.5.

Ответы [ 3 ]

0 голосов
/ 24 сентября 2010

Не ходите за базу или любой другой контроллер

Как сказано в документации:

По замыслу Zend_Controller_Action должен быть разделен на подклассы для создания контроллера действий.

Согласен, это вводит в заблуждение То, что они имели в виду, это

class Module_TotoController extends Zend_Controller_Action {}

class Module_TotoController extends Joe_Controller совершенно неправильно (извините, без обид)

как вы сказали, ваш ErrorController не может продлить ваш промежуточный Joe_Controller класс потому что ваше исключение будет снова сгенерировано в экземпляре класса ErrorController (как исключено !!!)

Ошибка uncaught Exception является результатом защиты от петель (dig Zend\Controller\Plugin\ErrorHanlder.php line 200-ish)

Если вам требуется что-то сделать для каждого действия, используйте Zend_Controller_Plugin и зарегистрируйте его с помощью frontController

0 голосов
/ 26 сентября 2010

в философии Zend они предоставляют метод init (), чтобы избежать хлопот

public class Module_TotoController extends Zend_Action_Controller {

    public function __construct(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response, array $invokeArgs = array())
        parent::__construct($request, $response, invokeArgs);

        // some init code here
    }
}

просто используйте:

public class Module_TotoController extends Zend_Action_Controller {

    public function init ()
        // some init code here
    }
}

Теперь, если вы посмотрите на источник класса Zend_Controller_Action, вы заметите, что следующие методы: empty :

  • init()
  • preDispatch ()
  • postDispatch ()

Это означает, что бесполезно звонить parent:: на ваш конкретный контроллер

public class Module_TotoController extends Zend_Action_Controller {

    public function init ()
        parent::init(); // useless ;-) but you can go for it 

        // some init code here
    }
}

Теперь, если вы хотите поместить промежуточный класс между Module_TotoController и Zend_Action_Controller, вы подвергаете себя большой суматохе:

  • Некоторые контроллеры не расширяют ваш «базовый» контроллер (например, ваш ErrorController в вашем вопросе)
    • так что это не совсем основа вашего приложения?
  • Если вы поместите некоторую логику в свой init () этой "базы",
    • Вы должны позвонить на parent:: в вашем init(),
    • все разработчики в проекте должны знать об этом
  • Вы когда-нибудь добавите еще несколько небольших функций к вашему «базовому» контроллеру
    • Это приведет к большому раздутому файлу
    • Загрузка / инициализация множества вещей, которые вам могут не понадобиться в этом лямбда-контроллере
      • Вам нужна база данных на каждой странице?
        • Нет: разве $this->_helper->connect(); не выглядит красиво?
        • Да: использовать плагин контроллера
  • Этот «базовый» контроллер не подойдет для других ваших проектов, поэтому этот класс не будет использоваться повторно
    • Действие помощников будет
    • Плагины контроллера будут

Надеюсь, это имеет смысл

0 голосов
/ 23 сентября 2010

Две мысли с моей головы:

  1. Имена контроллеров в модуле по умолчанию обычно называются как SomethingController. Ваше имя Joe_Controller предполагает наличие модуля Joe и пустое имя контроллера.

  2. При маршрутизации / отправке не ищет соответствующее действие до отправки на контроллер? Поскольку в примерах нет действий, возможно, вы вызываете исключение ControllerNotFound?

Просто выбрасываю некоторые идеи.

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