在 CodeIgniter 的钩子中使用 Loader 类
Posted
技术标签:
【中文标题】在 CodeIgniter 的钩子中使用 Loader 类【英文标题】:Use Loader class within a hook in CodeIgniter 【发布时间】:2013-05-12 23:00:10 【问题描述】:我有一个钩子里的函数:
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 挂钩。
谢谢, 彼得
【问题讨论】:
愚蠢的问题:您是否检查过会话类是否已加载以及会话用户数据是否不存在? 呵呵,是的。感谢您的评论,但他的会话肯定已加载,我在两分钟前对这里进行了排序:***.com/questions/16512799/…:P 【参考方案1】:实际问题是您使用了exit
。加载视图时,其输出将添加到输出类 (system/core/Output.php
)。然后通过system/core/CodeIgniter.php
中的$OUT->_display();
行将最终视图数据发送(回显)到浏览器。
由于您将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) 而不是钩子。根据您的情况/所需的功能,它可能更合适。
【讨论】:
这很有意义。谢谢你这么好的回答。非常深入。我只是使用了重定向,因此它没有加载该视图,而是重定向到带有使用该视图的控制器的页面。不过谢谢:) 那行得通。如果您不熟悉,我仍然建议您查看基本控制器。它们非常有用。【参考方案2】:pre_system
在系统执行期间很早就被调用。此时仅加载了基准和钩子类。没有发生路由或其他进程。
pre_controller
在调用任何控制器之前立即调用。所有基类、路由和安全检查均已完成。
post_controller_constructor
在您的控制器实例化后立即调用,但在任何方法调用发生之前。
post_controller
在您的控制器完全执行后立即调用。
display_override
覆盖 _display() 函数,用于在系统执行结束时将最终页面发送到 Web 浏览器。这允许您使用自己的显示方法。请注意,您需要使用 $this->CI =& get_instance() 引用 CI 超级对象,然后通过调用 $this->CI->output->get_output()
可以获得最终数据cache_override
使您能够调用自己的函数,而不是输出类中的 _display_cache() 函数。这允许您使用自己的缓存显示机制。
post_system
在最终渲染页面发送到浏览器后调用,在最终数据发送到浏览器后系统执行结束时调用。
所以
我认为您正在寻找的是 display_override
不过你也可以看看这里Does CodeIgniter have to load view in the final step?
【讨论】:
以上是关于在 CodeIgniter 的钩子中使用 Loader 类的主要内容,如果未能解决你的问题,请参考以下文章