Zend framework 如何处理Zend#u异常';当使用基本控制器时,在动作的预扩散或初始中?

Zend framework 如何处理Zend#u异常';当使用基本控制器时,在动作的预扩散或初始中?,zend-framework,exception-handling,Zend Framework,Exception Handling,如中所述,我创建了一个基本控制器 子类化动作控制器 根据设计,Zend_控制器的动作必须 创建子类以创建 动作控制器。至少,你 将需要定义操作方法 控制器可以调用的 除了创建有用的功能之外 对于您的web应用程序,您可以 还发现你重复了很多 使用相同的设置或实用方法 在您的各种控制器中;如果是,, 创建公共基础控制器 扩展的类 Zend_控制器_操作可以解决 这种冗余 但事实证明,从基函数调用异常是不正确的。。。要复制此文件,请创建一个文件: /path/to/workspace/library

如中所述,我创建了一个基本控制器

子类化动作控制器

根据设计,Zend_控制器的动作必须 创建子类以创建 动作控制器。至少,你 将需要定义操作方法 控制器可以调用的

除了创建有用的功能之外 对于您的web应用程序,您可以 还发现你重复了很多 使用相同的设置或实用方法 在您的各种控制器中;如果是,, 创建公共基础控制器 扩展的类 Zend_控制器_操作可以解决 这种冗余

但事实证明,从基函数调用异常是不正确的。。。要复制此文件,请创建一个文件:

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

然后:

然后在控制器目录中,IndexController.php扩展到基本目录之外:

class IndexController extends Joe_Controller
{
你会发现这个异常是不可能的

但是,如果不扩展基本控制器,则在init或preDispatch中引发异常,它将被捕获并转发到ErrorController

有人知道如何从基本控制器捕获异常吗

谢谢

更新以另一种方式解决此问题

在阅读了关于如何构造目录的各种文章和官方文档之后,我开始将基本控制器放入library/Joe/…但这可能是问题的一部分…手册中没有关于如何命名和放置基本控制器的指导。拥有基本控制器的专家做什么

另一次更新

再看看我的代码,并在网上阅读,似乎人们在中建议应该:

抽象类Joe_Controller_Action扩展了Zend_Controller_Action

除了改变它没有解决问题

现在考虑到有文章建议使用基本控制器,包括手册,这会被认为是Zend框架中的一个bug吗

要进行复制,只需在基本init或preDispatch中抛出任何类型的Zend_异常。假设你在那里轮询数据库(这就是我正在做的)…然后数据库关闭了。无错误控制器。这不是一个好情况,除非我做错了什么


我怀疑这是一个新的错误。。。我不记得Zend_应用程序之前出现过这个问题,我从ZF 1.5开始就一直在使用基本控制器。

我脑子里有两个想法:

  • 默认模块中的控制器名称通常命名为
    SomethingController
    。您的名字
    Joe\u Controller
    表示模块
    Joe
    和一个空的控制器名称

  • 在路由/分派中,它在分派到控制器之前不寻找匹配的操作吗?由于示例没有任何操作,您可能正在触发ControllerNotFound异常


  • 只要拿出一些想法。

    不要选择基地或任何控制器

    public class Module_TotoController extends Zend_Action_Controller {
    
        public function init ()
            parent::init(); // useless ;-) but you can go for it 
    
            // some init code here
        }
    }
    
    正如文件所说:

    根据设计,Zend_Controller_Action必须是子类,以便创建一个Action控制器

    同意,这是误导 他们的意思是

    类模块\u TotoController扩展Zend\u控制器\u操作{}

    类模块\u TotoController\u控制器
    完全错误(抱歉,没有冒犯)

    正如您所说,您的
    ErrorController
    无法扩展中间
    Joe\u Controller
    类 因为您的异常将在
    ErrorController
    类的实例化中再次抛出(作为例外!!!)

    uncaught异常
    错误是为避免循环而进行的保护的结果(dig
    Zend\Controller\Plugin\ErrorHanlder.php
    第200行)


    如果您需要为每个操作执行某些操作,请使用
    Zend_Controller_插件
    并将其注册到Zend哲学中的frontController

    ,它们提供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\u Controller\u Action
    类源代码,您将注意到以下方法是空的

    • init()
    • preDispatch()
    • postDispatch()
    这意味着,在特定的控制器中调用
    父项::
    是没有用的

    public class Module_TotoController extends Zend_Action_Controller {
    
        public function init ()
            parent::init(); // useless ;-) but you can go for it 
    
            // some init code here
        }
    }
    

    现在,如果您想在
    模块\u tototocontroller
    Zend\u Action\u Controller
    之间设置一个中间类,您将面临一个巨大的麻烦:

    • 某些控制器不会扩展您的“基本”控制器(例如您问题中的ErrorController)
      • 所以它不是应用程序的基础,是吗
    • 如果在该“基”的init()中放入一些逻辑,
      • 您必须在
        init()中调用
        父项::
      • 项目中的所有开发人员都需要意识到这一点
    • 您将永远为“基本”控制器添加其他小功能
      • 这将导致一个大的膨胀文件
      • 在lambda控制器中加载/初始化大量您可能并不真正需要的内容
        • 您是否需要在每个页面上添加数据库?
          • 否:不是一个
            $this->\u helper->connect()看起来漂亮吗
          • 是:使用控制器插件
    • 这个“基本”控制器将不适合您的其他项目需要,所以类将不可重用
      • 行动助手将
      • 控制器插件将

    希望有意义

    谢谢你帮我想清楚!(无法格式化回车符,因此我会将每个点移动到新注释中)。1。我刚刚将名称更改为Joe_BaseController,代码确实与ErrorController通信,因为尽管我更改了IndexControl