引导程序中的ZF1调度错误控制器

问题描述 投票:1回答:1

在我的Zend Framework 1项目中,我试图向Bootstrap.php添加一个初始化,该初始化将加载一些配置值,如果该配置值不存在,则捕获异常。在它捕获到异常之后,我希望它路由到错误控制器并显示来自其捕获到的异常的错误消息。

是否有一种方法可以在Zend Framework 1项目的Bootstrap.php中引发异常,并让错误处理程序像从控制器内部引发异常那样处理它?

更新:感谢David Weinraub,我提出了以下解决方案。

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);
    }
}

从这里抛出的任何异常都会被错误处理程序捕获并处理,并且会显示一条不错的消息,例如“ local.ini中缺少配置值'doctrine.conn.database'”,然后我使用注册表访问这些配置值(实体管理器和邮件处理程序,稍后将添加)在应用程序中的任何位置。

我希望我有权将此项目移至Zend Framework 2,使用起来容易得多。

php zend-framework
1个回答
3
投票

使用ErrorController处理异常在引导期间通常是有问题的。毕竟ErrorController本身取决于引导程序。

[如果可能,您能否将配置检查放在以front-controller plugin运行的routeStartup中?到那时,引导已经发生,并且标准的ErrorHandler插件已经注册,因此在其中引发异常应该导致ErrorController处理它。

我想您可以尝试/捕获您检查配置的块。然后,在捕获中,检查是否已注册ErrorHandler插件。如果不是,那么您自己手动注册它,然后重新引发该异常。没有测试,只是大声思考。

© www.soinside.com 2019 - 2024. All rights reserved.