TP5获取器的作用是对模型实例的(原始)数据做出自动处理。规范官方文档已经很明了了,贴上地址TP5获取器。
假如数据库中定义的 status
有很多种状态,并且对应的msg并不是$status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核'];
这种简单格式,那该如何处理。
使用枚举能更好的处理获取器。
定义一个枚举类(它并不是一个非常标准的枚举类,这里简称)
<?php
/**
* Created by PhpStorm.
* User: 一场丶
* Date: 2018/12/18
* Time: 22:30
*/
namespace app\index\enum;
class TestStatus
{
private $First = 1;
private $Second = 2;
private $Three = 3;
private $Four = 4;
private $num = null;
public function __construct($num)
{
foreach ($this as $key => $value){
if ($num === $value){
$this->num = $value;
}
}
}
public function getStr(){
$keyMap = [
$this->First => [
'str' => '我是1'
],
$this->Second => [
'str'=>'我是2'
],
$this->Three => [
'str' => '我是3'
],
$this->Four => [
'str' => '我是4'
],
];
return is_null($this->num) ?
false :
$keyMap[$this->num]['str'];
}
}
在模型中使用(直接对字段值进行修改)
<?php
/**
* Created by PhpStorm.
* User: 一场丶
* Date: 2018/12/18
* Time: 22:50
*/
namespace app\common\model;
use think\Model;
use app\index\enum\TestStatus;
class Test extends Model
{
public function getStatusAttr($value){
$str = (new TestStatus($value))->getStr();
return $str;
}
}
控制器中获取:
<?php
/**
* Created by PhpStorm.
* User: 一场丶
* Date: 2018/12/18
* Time: 22:30
*/
namespace app\index\controller;
use app\common\model\Test as TestModel;
use think\Controller;
class Index extends Controller
{
public function index(){
$res = TestModel::get(1);
print_r($res->status);
}
}
输出:
我是1
如果我们想保留status
字段,可以定义数据表中不存在的字段
模型中定义方法
getStatusTextAttr
<?php
/**
* Created by PhpStorm.
* User: 一场丶
* Date: 2018/12/18
* Time: 22:50
*/
namespace app\common\model;
use think\Model;
use app\index\enum\TestStatus;
class Test extends Model
{
public function getStatusTextAttr($value,$data){
$str = (new TestStatus($data['status']))->getStr();
return $str;
}
}
控制器使用:
<?php
/**
* Created by PhpStorm.
* User: 一场丶
* Date: 2018/12/18
* Time: 22:30
*/
namespace app\index\controller;
use app\common\model\Test as TestModel;
use think\Controller;
class Index extends Controller
{
public function index(){
$res = TestModel::get(1);
print_r($res->status_text);
}
}
同样得出结果:
我是1
以上就是TP5和枚举类型来使用获取器。这样就能更好的去处理获取器,代码可读性也会更高 。在模型中,只是需要调用枚举类已经处理好的方法,其中要输出字符串还是html格式文本,都不需要在模型中去定义。最后,获取器而不仅仅是在模型中定义一个方法,有一个类支撑,一个类比方法的扩展性和可读性都是更好的。
注:上面的枚举类只是一个个人示例,不喜勿愤。