benzene 发表于 2010-3-15 22:36:46

如何终止CI框架的运行

我现在遇到一个问题,大致是这样的,比如我写了一个函数专为用来检测登录,并且放在了我扩展的类里面
如下
function islogin(){$this->load->view("basic_tips");}

但是我的其他函数会吊用这个,比如在welcome里面

class Welcome extends SDO_Controller {

        function Welcome()
        {
                parent::SDO_Controller();
                $this->data["currentPage"] = "home";
        }
       
        function index()
        {
                $this->islogin();
                $this->load->view('welcome_index',$this->data);
        }
}


但是会显示2个界面,我想执行islogin后就输出islogin里面的模板,其他后面的不输出,我适用die()后没有任何内容了,所以不知道各位知道如何终止吗,排除适用if()

saturn 发表于 2010-3-15 22:53:33


$this->load->view("basic_tips");
exit();


这个理论上不属于CI的范畴,是PHP的知识。load view只是解析变量,然后包含一个文件而已。

system/libraries/Loader.php加载视图的片断如下:


if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)
{
        echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));
}
else
{
        include($_ci_path); //楼主看这里
}

benzene 发表于 2010-3-16 11:15:25

非常荣幸能得到管理员的恢复,主要是当我适用exit();的时候页面就空白了

saturn 发表于 2010-3-16 19:33:01

回复 3# benzene

不客气。

另外,我在二楼的回答是错误的!应该用return,而不是exit。因为exit是退出并停止当前脚本的工作,而return只是中止当前函数的执行。

实际情况是,不应该在加载一个view之后直接退出,因为此时CI还没有完成它的最终工作——输出视图。视图的输出由output库负责,而这一动作是在视图加载之后完成的。这也就不难解释为什么出现空白页,因为数据在buffer里面还没有被送到浏览器呢。

当局者迷,旁观者清。多站在高一点的角度看待问题。

sxpcrazy 发表于 2011-3-18 17:01:25

刚好和我遇到的问题一样,手册中也并没有说明,我是自己做了一个叫 Auth 的 library ,加入了 autoload 里面,我在这个 Auth 的类里面检查用户身份,然后使用不同的 view 去显示,但是因为是 library ,不会阻止 controller 的调用,所以 controller 还是会去执行并且输出他自己的 view ,有没有办法可以在 library 里面就结束后面的 controller 的调用?

sxpcrazy 发表于 2011-3-18 17:10:33

也就是说我想在 autoload 的 library 里面就终止后面的 controller 的运行,直接输出内容,不要走后面的流程了,如何做到?设置变量在 controller 里面检查当然是可以做到的,但我的 Auth 需要每个页面之前都会运行,必须先验证用户身份再决定用户是否有权访问或者让用户离开。

如果我的做法不是通常做法,请指教一个这种模式的通常做法,据我了解 hook 也无法控制后续流程不要进行,目前我看到的手册中都没有流程控制相关的概念,最好能深入说明下,谢谢

Hex 发表于 2011-3-18 19:27:01

回复 6# sxpcrazy


    不修改 CI 源码,你的需求无法实现, CI 没有这个流程,你看看 CI 的流程图就知道了。
页: [1]
查看完整版本: 如何终止CI框架的运行