代码之家  ›  专栏  ›  技术社区  ›  joedevon

在使用基本控制器时,如何处理动作的predpatch或init中的zend_异常?

  •  3
  • joedevon  · 技术社区  · 15 年前

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

    动作控制器的子类化

    根据设计,Zend_控制器动作必须 为了创建一个 动作控制器。至少,你 将需要定义操作方法 控制器可能会呼叫。

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

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

    /路径/to/workspace/library/joe/controller.php

    然后:

    class Joe_Controller extends Zend_Controller_Action
    {
        public function init()
        {
            Throw new Zend_Exception('test', 500);
            parent::init();
        }
    }
    

    然后在您的控制器目录中,indexcontroller.php扩展到基目录之外:

    class IndexController extends Joe_Controller
    {
    

    你会发现这个例外没有被发现。

    但是,如果您不从基控制器扩展,那么在in it或predpatch中抛出一个异常,它将被捕获并转发到errorcontroller。

    有人想从基础控制器捕获异常吗?

    谢谢。

    更新以另一种方式处理

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

    另一个更新

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

    抽象类joe_controller_action扩展zend_controller_action。

    除了改变它没有解决问题…

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

    要复制,只需在base init或predpatch中抛出任何类型的zend_异常。假设您在那里轮询数据库(这是我正在做的),数据库就关闭了。无错误控制器。除非我做错了什么,否则情况不太好。

    我怀疑这是一个新的虫子…在Zend_应用程序之前我不记得这个问题,我从zf 1.5开始就一直在使用基本控制器。

    3 回复  |  直到 15 年前
        1
  •  0
  •   David Weinraub    15 年前

    我脑子里有两个想法:

    1. 默认模块中的控制器名称通常命名为 SomethingController . 你的名字 Joe_Controller 建议模块 Joe 和一个 空的 控制器名称。

    2. 在路由/调度中,它不是寻找匹配的吗 行动 在发送给管制员之前?由于示例没有任何操作,您是否触发了ControllerNotFound异常?

    把一些想法扔出去。

        2
  •  0
  •   Julien    15 年前

    在Zend哲学中,它们提供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_Controller_Action 类源,您将注意到以下方法是 空的 :

    • init()
    • preDispatch ()
    • postDispatch ()

    这意味着,打电话是没用的 parent:: 在特定的控制器中

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

    现在,如果你想在 Module_TotoController Zend_Action_Controller 你让自己陷入了一个大麻烦:

    • 有些控制器无法扩展您的“基本”控制器(例如您的问题中的错误控制器)
      • 所以它不是你应用程序的基础,是吗?
    • 如果在“base”的init()中添加了一些逻辑,
      • 你必须打电话给 起源:: 在你的 () ,
      • 项目中的所有开发人员都需要意识到这一点
    • 您将永远为您的“基础”控制器添加其他小功能
      • 这会导致文件膨胀
      • 加载/初始化lambda控制器中可能不需要的大量内容
        • 你需要每一页都有数据库吗?
          • 不,不是吗? $this->_helper->connect(); 看起来不错?
          • 是:使用控制器插件
    • 这个“基础”控制器不适合您的其他项目需求,因此该类将不可重用。
      • 行动助手将
      • 控制器插件将

    希望它有意义

        3
  •  -1
  •   Julien    15 年前

    不要找基地或任何控制者

    如文件所述:

    根据设计,Zend_控制器动作必须是子类才能创建动作控制器。

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

    class Module_TotoController extends Zend_Controller_Action {}

    class Module_TotoController extends Joe_Controller 明显错误(对不起,没有冒犯)

    就像你说的 ErrorController 不能延长你的中级 Joe_Controller 班 因为您的异常将在 误差控制器 类(除外!!)

    这个 uncaught Exception 错误是避免回路保护的结果(dig Zend\Controller\Plugin\ErrorHanlder.php 第200行(ish)

    如果你需要为每一个动作做点什么,使用 Zend_Controller_Plugin 并在前台控制器上登记。