旗下导航:搜·么
当前位置:网站首页 > PHP框架 > ThinkPHP > 正文

ThinkPHP:模子三大利器之三(猎取器)【ThinkPHP教程】,ThinkPHP,模型,获取器

作者:搜搜PHP网发布时间:2019-12-17分类:ThinkPHP浏览:126


导读:定义猎取器猎取器的作用是对模子对象的(原始)数据做出自动处置惩罚。一个猎取器对应模子的一个特别要领(该要领必需为public范例),要领定名范例为:getFi...

定义猎取器

猎取器的作用是对模子对象的(原始)数据做出自动处置惩罚。一个猎取器对应模子的一个特别要领(该要领必需为public范例),要领定名范例为:

getFieldNameAttr

FieldName为数据表字段的驼峰转换或许你数据表不存在的字段(注重明白背面这句话),下面是一个典范的猎取器定义:

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
    public function getUserTypeAttr($value, $data)
    {
        $type = [0 => '平常', 1 => 'VIP', 2 => '黄金', 3 => '白金', 4 => '钻石'];
        return $type[$value];
    }
}

你须要给每个须要输出转换处置惩罚的数据字段定义一个对应的猎取器,但猎取器的字段名不一定要和数据表的字段名一致,比方我愿望给user_type字段定义一个名为getTypeAttr的猎取器也是许可的,但要注重这个时刻传入猎取器的第一个参数肯定是没有值(由于没有对应的数据表字段数据),只能经由过程第二个参数猎取你须要的数据。

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
    public function getTypeAttr($value, $data)
    {
        $type = [0 => '平常', 1 => 'VIP', 2 => '黄金', 3 => '白金', 4 => '钻石'];
        return $type[$data['user_type']];
    }
}

固然更加严谨的状况下,你还须要推断下是不是存在$data['user_type'],这个暂时略过。

注重第二个参数的data数据,大概自身已经过了猎取器的处置惩罚(假如你定义了相干的猎取器的话)。

为何要定义一个和数据报字段不一致的猎取器呢?最显著的优点能够辨别差别的字段猎取原始数据和处置惩罚过的数据。事实上,有许多来由能够让你定义一些数据表不存在的字段猎取器,这恰恰是猎取器的魅力地点。

看的出来猎取器定义自身没什么难度,症结在于要领内里的猎取逻辑,这是现实运用中最须要关注的。

挪用猎取器

定义猎取器以后会在以下状况自动触发:

·模子的数据对象取值操纵(比方$model->field_name);

·模子的序列化输出操纵(比方$model->toArray()或toJson());

·显式挪用getAttr要领(比方$model->getAttr('field_name'));

前面两种实在终究都是挪用末了一种来完成的,最症结的是要明白第一种。模子对象取值的时刻平常都是经由过程下面的体式格局:

$user = User::get(1);
echo $user->name;
echo $user->user_type;

当我们运用上面的体式格局举行模子对象数据猎取或许在模板输出的时刻事实上都邑根据下面的递次来检测和猎取数据。

·第1步——假如查询效果包含该字段数据,取回原始数据,不然并进入第2步;

·第2步——搜检是不是定义该字段的猎取器(包含动态猎取器),假如有,则挪用猎取器返回效果,没有则进入第3步;

·第3步——搜检是不是定义了字段的范例转换,有则举行转换处置惩罚并返回效果,没有则进入第4步;

·第4步——假如是体系的时候字段,则自动举行时候格式化处置惩罚并返回效果,不然进入第5步;

·第5步——假如第1步搜检的时刻不包含该字段数据,则搜检是不是存在关联属性定义,有则经由过程关联关联猎取数据并返回效果,不然抛出属性未定义的非常。

上面的这五个步骤的细致代码,假如你有兴致的能够直接参考think\model\concern\Attribute的getAttr要领代码。

简朴来讲,当你猎取$user->user_type的时刻都邑去搜检是不是定义了相干的猎取器,而不论user_type字段是不是是一个实在的数据表字段。

但许多状况下,你不会一个个去猎取模子数据,而是把悉数模子数据返回给客户端或许模板。

public function index()
{
    $user = User::get(1);
    return json($user);
}

在这类状况下,实在就是在相应输出的时刻举行了模子的toJson处置惩罚。

有一点至关重要,假如你的猎取器定义了非数据表的字段,是不会自动输出的,必需经由过程append要领追加分外属性(而且支撑追加关联模子属性)。

假如我们定义了一个type属性的猎取器(假定这并非一个实在的数据表字段),那末须要运用下的体式格局才一般输出(不然你大概只要user_type数据):

public function index()
{
    $user = User::get(1);
    return json($user->append(['type']));
}

假如你是运用toArray的话,处置惩罚体式格局雷同。

假如是数据集查询的话,一样能够运用append要领一致追加分外字段。

public function index()
{
    $users = User::all();
    return json($users->append(['type']));
}

除了append要领以外,我们还支撑用hidden要领暂时隐蔽一些数据。

猎取原始数据

有些状况下,除了要猎取处置惩罚过的数据外,还须要猎取原始数据以便应对差别的需求。

假如你的猎取器都是用的辨别于现实数据表字段的分外属性字段,那末这个问题自身已处理了。所以我们重要议论的是当你的猎取器属性和数据表字段一致的状况下,该怎样猎取原始数据。

一个最简朴的方法是运用getData要领:

$user = User::get(1);
// 猎取user_type猎取器数据
echo $user->user_type;
// 猎取原始的user_type数据
echo $user->getData('user_type');
// 猎取悉数原始数据
dump($user->getData());

动态猎取器

前面我们提到过动态猎取器的观点,动态猎取器就是不须要在模子类内里定义猎取器要领,而是在查询的时刻运用闭包来定义一个字段的猎取器对数据举行一致的处置惩罚。

User::withAttr('name', function($value, $data) {
return strtolower($value);
})->select();

假如你须要定义多个动态猎取器,屡次挪用withAttr要领就行。

动态猎取器的意义除了能够不用在模子内里定义猎取器要领以外,还能够起到掩盖已定义的猎取器的作用,而且动态猎取器能够支撑Db类操纵,弥补了Db操纵不能运用猎取器的缺憾,详细就看本身的需求来挑选了。

Db::name('user')->withAttr('name', function($value, $data) {
return strtolower($value);
})->select();

总结

无论是猎取器,照样之条件的修改器、搜索器,其作用无非是把你的模子事情细化和拆分,如许代码和逻辑也会更清楚,可维护性也大大加强,至于机能,历来不是模子起首斟酌的。

ki4网,有大批免费的ThinkPHP入门教程,迎接人人进修!

本文转自:https://blog.thinkki4.cn/825350

以上就是ThinkPHP:模子三大利器之三(猎取器)的细致内容,更多请关注ki4网别的相干文章!

标签:ThinkPHP模型获取器