在CodeIgniter中的钩子中使用Loader类

时间:2013-05-12 23:00:10

标签: php codeigniter class view loader

我有一个钩子中的这个功能:

public function checkIfLogged() {
    $this->CI = & get_instance();
    if(!$this->CI->session->userdata('logged') ){
        $this->CI->load->view('common/home');
        exit;
    }
}

我的问题是$this->CI->load->view('common/home');实际上根本没有加载模板文件。有什么原因吗?

我正在使用post_controller_constructor hook。

谢谢, 彼得

2 个答案:

答案 0 :(得分:2)

实际问题是您使用exit。加载视图时,其输出将添加到Output类(system/core/Output.php)。然后,最终视图数据将通过$OUT->_display();中的system/core/CodeIgniter.php行发送(回显)到浏览器。

由于您在那里抛出了exit,脚本会停止,并且永远不会调用该显示方法。

我真的不知道你正在尝试用这个钩子做什么(如果用户退出或者什么的话,它看起来像显示一个指定的页面),但最快的解决方案是返回视图的输出并直接从钩子回声。

public function checkIfLogged() {
    $this->CI = & get_instance();
    if(!$this->CI->session->userdata('logged') ){
        exit($this->CI->load->view('common/home', null, true));
    }
}

我不鼓励使用display_override挂钩,因为整个控制器的代码将在挂钩甚至有机会检查特定会话数据之前运行(并且您的控制器可能甚至会覆盖该会话数据,给出意想不到的结果)。

您甚至可以考虑使用基本控制器(MY_Controller)而不是钩子。根据您的情况/所需功能,它可能更合适。

答案 1 :(得分:1)

<强> pre_system

在系统执行期间很早就打电话。此时只加载了基准和钩子类。没有发生路由或其他进程。

<强> pre_controller

在调用任何控制器之前立即调用。所有基类,路由和安全检查都已完成。

<强> post_controller_constructor

在实例化控制器之后立即调用,但在任何方法调用发生之前调用。

<强> post_controller

完全执行控制器后立即调用。

<强> display_override

覆盖_display()函数,用于在系统执行结束时将最终页面发送到Web浏览器。这允许您使用自己的显示方法。请注意,您需要使用$ this-&gt; CI =&amp; amp;来引用CI超级项目。 get_instance()然后通过调用$ this-&gt; CI-&gt; output-&gt; get_output()

来获得最终数据

<强> cache_override

使您可以在输出类中调用自己的函数而不是_display_cache()函数。这允许您使用自己的缓存显示机制。

<强> post_system

在最终渲染页面发送到浏览器后,在最终数据发送到浏览器后系统执行结束时调用。

所以

我认为你要找的是 display_override

但你也可以看看Does CodeIgniter have to load view in the final step?