Zend framework 如何处理Zend#u异常';当使用基本控制器时,在动作的预扩散或初始中?
如中所述,我创建了一个基本控制器 子类化动作控制器 根据设计,Zend_控制器的动作必须 创建子类以创建 动作控制器。至少,你 将需要定义操作方法 控制器可以调用的 除了创建有用的功能之外 对于您的web应用程序,您可以 还发现你重复了很多 使用相同的设置或实用方法 在您的各种控制器中;如果是,, 创建公共基础控制器 扩展的类 Zend_控制器_操作可以解决 这种冗余 但事实证明,从基函数调用异常是不正确的。。。要复制此文件,请创建一个文件: /path/to/workspace/library/Joe/Controller.php 然后: 然后在控制器目录中,IndexController.php扩展到基本目录之外:Zend framework 如何处理Zend#u异常';当使用基本控制器时,在动作的预扩散或初始中?,zend-framework,exception-handling,Zend Framework,Exception Handling,如中所述,我创建了一个基本控制器 子类化动作控制器 根据设计,Zend_控制器的动作必须 创建子类以创建 动作控制器。至少,你 将需要定义操作方法 控制器可以调用的 除了创建有用的功能之外 对于您的web应用程序,您可以 还发现你重复了很多 使用相同的设置或实用方法 在您的各种控制器中;如果是,, 创建公共基础控制器 扩展的类 Zend_控制器_操作可以解决 这种冗余 但事实证明,从基函数调用异常是不正确的。。。要复制此文件,请创建一个文件: /path/to/workspace/library
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
和一个空的控制器名称只要拿出一些想法。不要选择基地或任何控制器
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异常
错误是为避免循环而进行的保护的结果(digZend\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