模型的優勢不是用來做基礎的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方法獲取;