Dcat Admin 教程 - 如何优雅地更改表单值的数据类型?
2021-01-07 admin laravel 1976
在日常使用中,我们经常会遇到需要更改用户输入的表单值的数据类型的情况。
例如数据表中有一个 title 字段并声明为 not null,那么我们则需要保证该字段的值保存到数据库时的数据类型不能是 null,否则数据库会报错。在 Dcat Admin 中,我们通常可以使用以下方法转换表单值的数据类型:
$form->text('title')->saving(function ($value) {
// 强制转化为string类型
return (string) $value;
});
这种用法是没有问题的,但是当类似 title 这样需要转换类型的字段非常多的时候,我们的代码会变得杂乱,如:
$form->text('title')->saving(function ($value) {
return (string) $value;
});
$form->text('first_name')->saving(function ($value) {
return (string) $value;
});
$form->text('last_name')->saving(function ($value) {
return (string) $value;
});
那么有没有方法可以让你的代码变得更简洁呢?答案当然是有的,并且非常简单,我们可以利用 Laravel 的 macro 功能来扩展这个功能。
打开 app/Admin/bootstrap.php,写入以下代码:
// 扩展表单字段方法
// 保存为字符串
Form\Field::macro('saveAsString', function () {
return $this->saving(function ($v) {
return (string) $v;
});
});
然后就可以在你的 form 表单中这么使用了:
$form->text('title')->saveAsString();
$form->text('first_name')->saveAsString();
$form->text('last_name')->saveAsString();
现在代码就简洁很多啦。
但是这个通过 macro 扩展出来的方法,还有那么一点点的不足,我们的编辑器没办法识别这个方法,没有自动补全提示。所以下面我们可以通过一个小技巧,让你的编辑器能识别这个通过 macro 扩展出来的方法。
在你的项目根目录中新建一个文件.ide_helper.php,然后打开并写入以下内容:
namespace Dcat\Admin\Form
{
/**
* @method $this saveAsString()
*/
class Field
{}
}
然后你的编辑器就能识别这个方法了,是不是非常简单。
Laravel 的 macro 是一个非常强大的功能,Dcat Admin 内置的许多功能都支持了 macro 操作,大家可以自行发掘出更多姿势技巧。