🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
模型的优势不是用来做基础的CURD操作的,虽然CURD操作也是一种最常见的业务逻辑,只是这些基本逻辑无需再定义额外的方法了,系统已经内置实现了。但实际的应用中,一般都需要根据业务需求来增加额外的业务逻辑方法。 以User模型为例,假设我们需要实现下列功能: 1. 用户注册; 2. 用户登陆; 3. 获取用户信息; 4. 获取用户的身份角色; ...更多业务逻辑 可以在User模型添加下面的逻辑方法: ~~~ <?php namespace app\index\model; use think\Model; class User extends Model { /** * 注册一个新用户 * @param array $data 用户注册信息 * @return integer|bool 注册成功返回主键,注册失败-返回false */ public function register($data = []) { $result = $this->validate(true)->allowField(true)->save($data); if ($result) { return $this->getData('id'); } else { return false; } } /** * 用户登录认证 * @param string $username 用户名 * @param string $password 用户密码 * @return integer 登录成功-用户ID,登录失败-返回0或-1 */ public function login($username, $password) { $where['username'] = $username; $where['status'] = 1; /* 获取用户数据 */ $user = $this->where($where)->find(); if ($user) { if (md5($password) != $user->password) { $this->error = '密码错误'; return 0; } else { return $user->id; } } else { $this->error = '用户不存在或被禁用'; return -1; } } /** * 获取用户信息 * @param integer $uid 用户主键 * @return array|integer 成功返回数组,失败-返回-1 */ public function info($uid) { $user = $this->where('id', $uid)->field('id,username,email,mobile,status')->find(); if ($user && 1 == $user->status) { // 返回用户数据 return $user->hidden('status')->toArray(); } else { $this->error = '用户不存在或被禁用'; return -1; } } /** * 获取用户角色 * @return integer 返回角色信息或者返回-1 */ public function role() { $uid = $this->getData('id'); if ($uid) { $role = $this->getUserRole($uid); if ($role) { return $role; } else { $this->error = '用户未授权'; return 0; } } else { $this->error = '请先登录'; return -1; } } protected function getUserRole($uid) { return $this->table('role')->where('uid', $uid)->find(); } } ~~~ 我们先不要在意方法的实现细节(这些实现代码并非完美,只是简单的说明问题),里面的很多调用方法后面都会一一提及,这里只是告诉你如何在模型类里面添加自己的业务逻辑,下面同时给出在控制器中的调用参考。 先不要在意方法的实现细节(这些实现代码并非完美,只是简单的说明问题),里面的很多调用方法后面都会一一提及,这里只是告诉你如何在模型类里面添加自己的业务逻辑,下面同时给出在控制器中的调用参考。 ~~~ <?php namespace app\index\controller; use app\index\model\User; use think\Controller; use think\Session; class Index extends Controller { public function login() { return $this->fetch(); } public function doLogin(User $user, $username, $password) { $uid = $user->login($username, $password); if ($uid) { Session::set('user_id', $uid); $this->success('登录成功'); } else { $this->error('登录失败'); } } public function register() { return $this->fetch(); } public function doRegister(User $user) { $data = $this->request->param(); $result = $user->register($data); if ($result) { $this->success('用户注册成功'); } else { $this->error($user->getError()); } } public function getUserInfo(User $user, $uid) { $info = $user->info($uid); if ($info) { $this->assign('user', $info); return $this->fetch(); } else { return '用户不存在'; } } protected function getUserRole() { $uid = Session::get('user_id'); $user = User::get($uid); return $user->role(); } } ~~~ 控制器的详细用法不属于本书的讨论范畴,如果有必要可以参考官方快速入门系列第三部:《控制器从入门到精通》。 从上面的用法中我们可以注意几点: 1. 业务逻辑应当封装到具体模型中,并由控制器来调用; 2. register和login方法获取用户主键的方法区别; 3. 可以设置模型的错误信息,并且用getError方法获取;