Can
Be Better

ThinkPHP 读取器和修改器

读取器

过去Controller内输出日期

echo data('Y/m/d',$user->birthday);

 

前面读取用户生日的时候,使用了date 方法进行日期的格式处理输出,但是每次读取数据后都需要这样处
理就显得非常麻烦。
使用读取器功能就可以简化类似的数据处理操作,例如,我们给User 模型添加读取器的定义方法。

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
// birthday读取器
protected function getBirthdayAttr($birthday)
{
return date('Y-m-d', $birthday);
}
}

 

这里,我们添加了一个getBirthdayAttr 读取器方法用于读取User 模型的birthday 属性的值,该方
法会在读取birthday属性值的时候自动执行
读取器方法的命名规范是:
get + 属性名的驼峰命名+ Attr
所以, getBirthdayAttr 读取器读取的是birthday 属性,而getUserBirthdayAttr 读取器读取的
则是user_birthday 属性。
定义完修改器后,修改控制器的read 操作方法如下:
// 读取用户数据
public function read($id='')
{
$user = UserModel::get($id);
echo $user->nickname . '<br/>';
echo $user->email . '<br/>';
echo $user->birthday . '<br/>';
}

 

读取器还可以定义读取数据表中不存在的属性,例如把原始生日和转换的格式分开两个属性birthday 和
user_birthday ,我们只需定义user_birthday 属性的读取器方法:
<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
// user_birthday读取器
protected function getUserBirthdayAttr($birthday,$data)
{
return date('Y-m-d', $data['birthday']);
}
}

 

这里的读取器方法使用了第二个参数,表示传入所有的属性数据。因为原始的user_birthday 属性数据是
不存在的,所以我们需要通过data 参数获取。
read操作方法修改为:
// 读取用户数据
public function read($id='')
{
$user = UserModel::get($id);
echo $user->nickname . '<br/>';
echo $user->email . '<br/>';
echo $user->birthday . '<br/>';
echo $user->user_birthday . '<br/>';
}

 

修改器

由于birthday 属性是时间戳(整型)格式的,因此我们必须在写入数据前进行时间戳转换,前面使用的方法是每次赋值的时候进行转换处理:
$user[‘birthday’] = strtotime(‘2015-04-02’);
为了避免每次都进行日期格式的转换操作,可以定义修改器方法来自动处理,修改User 模型如下:
<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
// 读取器
protected function getUserBirthdayAttr($birthday, $data)
{
return date('Y-m-d', $data['birthday']);
}
// birthday修改器
protected function setBirthdayAttr($value)
{
return strtotime($value);
}
}

 

修改器方法的命名规范是:

set + 属性名的驼峰命名+ Attr
所以, setBirthdayAttr 方法修改的是birthday 属性,而setUserBirthdayAttr 方法修改的则是
user_birthday 属性。
控制器的add 操作方法修改如下:
// 新增用户数据
public function add()
{
$user = new UserModel;
$user->nickname = '流年';
$user->email = '[email protected]';
$user->birthday = '1977-03-05';
if ($user->save()) {
return '用户[ ' . $user->nickname . ':' . $user->id . ' ]新增成功';
} else {
return $user->getError();
}
}

 

之前的程序
$user = new User;
$user->nickname = '流年';
$user->email = '[email protected]';
$user->birthday = strtotime('1977-03-05');
if ($user->save()) {
return '用户[ ' . $user->nickname . ':' . $user->id . ' ]新增成功';
} else {
return $user->getError();
}

 

通过定义修改器和读取器,完成了时间戳方式存储的birthday 属性的写入和读取的自动处理
赞(0) 打赏
不开启评论,如有问题疑问请发邮件。[email protected]最长的路 » ThinkPHP 读取器和修改器
分享到: 更多 (0)