接着前面看, 如果做用户登录功能,用户模块会写在user_service类中。需要登录判断则会增加一个login方法,传入用户名和密码并返回bool值。user_service示例代码如下:
PHP复制代码
public function login ($username, $password)
{
$admin = $this->user_model->getUserInfo(array(
'username' => $username
));
if(! empty($admin)
&& ($admin['password'] == pwd ($password, $admin['salt']))) {
return true;
}
return false;
}
复制代码
用户登录时调用该方法, 根据返回值确定是否要设置登录状态并获取用户资料。如果说要增加ajax控制, 则ajax控制器中只需要接受参数并调用service的方法即可。 来分析下上面这个例子, 控制器调用了service, service调用model获取数据并判断密码是否相等。如果没有service层会怎么样?控制器调用model中的方法,并在控制器中判断密码是否相等,或者说在model中实现上面方法。 如果model只是返回数据,则ajax和登录页面都需要自己判断密码是否相同。 如果model实现判断过程,大部分情况下我们会不由自主的针对问题来写代码,即取数据和判断放在一个过程中。那如果其他地方需要根据用户名获取用户信息就要重写方法了。 如果取数据独立出去呢?也可以的,大部分时候用CI能控制到这里已经很不错了。但这只是一个简单的逻辑,如果更复杂的逻辑,需要调用多个model,那service的功能就更明显了。所以不建议把业务逻辑写在底层的model中。 对于控制器,倒不强制把业务逻辑一定写在service中,但至少可以将一些公用部分,以及复杂的业务逻辑抽离。 接下说下控制器中需要注意的事项: 1、 控制器只支持一级目录,不可递归下去,因为支持PATH_INFO的路由方式,想一下都不能递归下去。可使用$this->router对象来获取当前文件夹控制器和方法名。 2、 上层文件将会先解析。如果控制下有admin.php也有admin文件夹则会解析到admin.php控制器。 3、 控制器中的视图不建议在PHP页面load多个,视图的事情应该交给视图去处理, 写在控制器中视图调整时,控制器也要相应调整。 4、 对于公用的Action可以按模块或者按请求类型来区分,具体情况根据项目而定。
|