php - ZF1 从 Bootstrap 调度错误 Controller

标签 php zend-framework

在我的 Zend Framework 1 项目中,我尝试向 Bootstrap.php 添加一个 init,它将加载一些配置值,然后在配置值不存在时捕获异常。在它捕获异常后,我希望它路由到错误 Controller 并显示它捕获的异常中的错误消息。

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

更新: 感谢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,这样更容易使用。

最佳答案

在引导期间使用 ErrorController 处理异常通常会出现问题。毕竟,ErrorController 本身依赖于该引导。

如果可能的话,你能把你的配置检查放在 front-controller plugin 中吗?在 routeStartup 运行?到那时,引导已经发生并且标准 ErrorHandler 插件已经注册,因此抛出异常应该会导致 ErrorController 处理它。

我想你可以尝试/捕获检查配置的 block 。然后,在 catch 中,检查 ErrorHandler 插件是否已注册。如果没有,那么你自己手动注册一下,然后重新抛出异常。未经测试,只是大声思考。

关于php - ZF1 从 Bootstrap 调度错误 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19969560/

相关文章:

php - 向 GridView 小部件添加过滤器

php - mysql order by max匹配字段值

php - json多维数组和jquery?

php - 直接加入zend框架

javascript - 如果产品缺货,则显示属性 Magento

php - 按用户角色过滤 WordPress 评论

javascript - 如何将多个变量传递给 HTML/PHP 中的 JavaScript 函数?

PHP-ZendFramework : How to use Zend_Translate without the whole framework?

php - fatal error : Call to a member function load() on a non-object (P4A application Framework)

javascript - 如何在 Laravel 中从服务器发送 javascript 响应而不转义字符