2013-11-14 3 views
0

В моем проекте Zend Framework 1 я пытаюсь добавить init в Bootstrap.php, который загрузит некоторые значения конфигурации, а затем поймает исключение, если значение конфигурации не существует. После того, как он поймает исключение, я хочу, чтобы он направился к контроллеру ошибок и отобразил сообщение об ошибке из исключения, которое он поймал.Ошибка диспетчера отправки ZF1 от начальной загрузки

Есть ли способ выбросить исключение в Bootstrap.php в проекте Zend Framework 1 и обработать обработчик ошибок так, как если бы исключение было выброшено из контроллера?

Update: Благодаря Дэвид Вейнрауб я придумал следующее решение.

Bootstrap.php:

protected function _initRegistry() 
{ 
    $options = $this->getOptions(); 
    $fc = Zend_Controller_Front::getInstance(); 
    $fc->registerPlugin(new Application_Plugin_RegistryHandler($options)); 
} 

RegistryHandler.php:

use Application\Service\Config\Config; 
use Application\Service\Config\MailConfig; 

/** 
* Handles the loading of objects and values into the registry, we use a plugin 
* so exceptions can be thrown and caught with 
* Zend_Controller_Plugin_ErrorHandler. 
*/ 
class Application_Plugin_RegistryHandler extends Zend_Controller_Plugin_Abstract 
{ 
    /** 
    * @var array 
    */ 
    private $options; 

    /** 
    * @param array $options 
    */ 
    public function __construct($options) 
    { 
     $this->options = $options; 
    } 

    /** 
    * Load the config classes into registry on route startup 
    * so the error controller should be loaded and ready to catch exceptions. 
    * 
    * @param Zend_Controller_Request_Abstract $request 
    */ 
    public function routeStartup(Zend_Controller_Request_Abstract $request) 
    { 
     $registry = Zend_Registry::getInstance(); 
     $mailConfig = new MailConfig($this->options); 
     $config = new Config($this->options); 
     $config->setMailConfig($mailConfig); 
     $registry->set('config', $config); 
    } 
} 

Любые исключения, брошенные здесь перехватываются и обрабатываются с обработчик ошибок и может отображать хорошее сообщение, как «значение настройки" doctrine.conn.database 'отсутствует в local.ini ", затем я использую реестр для доступа к этим значениям конфигурации (менеджер сущностей и почтовый обработчик, которые будут добавлены позже) из любого места приложения.

Мне жаль, что у меня не было права переместить этот проект на Zend Framework 2, с которым гораздо легче работать.

ответ

2

Использование ErrorController для обработки исключений при загрузке обычно проблематично. В конце концов, сам ErorController зависит от этой начальной загрузки.

Если возможно, можете ли вы проверить свою конфигурацию в front-controller plugin, работающем по адресу routeStartup? К тому времени начальная загрузка уже произошла, и стандартный плагин ErrorHandler уже зарегистрирован, поэтому выброс исключения должен привести к обработке ErrorController.

Я полагаю, вы могли бы попробовать/поймать блок, где вы проверите конфигурацию. Затем в catch вы проверяете, был ли уже зарегистрирован плагин ErrorHandler. Если нет, тогда вы вручную зарегистрируете его самостоятельно, а затем повторно выбросите исключение. Не проверено, просто вслух.

Смежные вопросы