模型的优势不是用来做基础的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方法获取;