用户
 找回密码
 入住 CI 中国社区
搜索
查看: 5687|回复: 6
收起左侧

[HELP] 请教各位,ci有没有类似struts的拦截器功能那

[复制链接]
发表于 2010-2-9 08:48:01 | 显示全部楼层 |阅读模式
本人刚接触php,使用ci作一个公司内部的系统,需要用类似拦截器的功能,检测session里登陆信息的验证。ci是用什么实现的?hook能指定作用对象吗?
发表于 2010-2-9 09:11:58 | 显示全部楼层
发表于 2010-2-9 09:17:57 | 显示全部楼层
登录正确的时候写session信息。
PHP复制代码
 
$this->load->library('session');
$newdata = array(
                   'username'  => 'johndoe',
                   'email'     => 'johndoe@some-site.com',
                   'logged_in' => TRUE
               );
 
$this->session->set_userdata($newdata);
 
 
复制代码

验证的时候:
PHP复制代码
 
if( $this->session->userdata('logged_in')){
echo "login success";
}
else
{
redirect("user/login");
}
 
复制代码


可以把这段代码写成一个函数,在只有登录后才能访问的页面里调用这个函数就可以了。
 楼主| 发表于 2010-2-9 09:35:51 | 显示全部楼层
2楼给的方法是不错,但我觉得实际效果并不会很好,因为这种做法是用户不知道自己有无权限,点了再说,出错了才知道没权限,通常都会要求对无权限的用户操作按钮不可见。3楼提供的方法可以说是没有办法的办法了,其实我觉得hook很接近我的需求了,只是他的作用范围实在太不方便了,能设置hook只对某几个control作用吗?
发表于 2010-2-9 14:16:05 | 显示全部楼层
这就是 ACL 类库应该做的事情,是先验证还是后验证,就是页面呈现问题了。
不一定用 HOOK
发表于 2010-2-10 09:03:30 | 显示全部楼层
2楼给的方法是不错,但我觉得实际效果并不会很好,因为这种做法是用户不知道自己有无权限,点了再说,出错 ...
t2money11 发表于 2010-2-9 09:35



  为什么说实际效果不好呢...改下页面显示就行了...其他PHP框架也这样子处理.
发表于 2014-6-23 12:08:06 | 显示全部楼层
我同样有这个问题,很多情况需要在业务中判断每个控制器的最终输出,是否登录只是其中一种,比如还有用户基本信息是否填写完整,用户是否已经发表过文章……等等。这些写单独的拦截器来是非常方便的,尤其像Node.js里用Express的路由,可以一连串的拦截器判断后做不同的输出。

而CI中我尝试把每个拦截器写成helper函数,但这样helper里无法调用CI实例里的protected方法。最主要的原因我不希望所有业务验证的方法都写在一个控制器基类里,这样非常不灵活。之后看了hook,但还是不能解决问题,AOP的方法依然不能调用CI实例上的方法。

所以我也在想有什么办法可以实现拦截器类似的功能,同求指教!

本版积分规则