laravel - 在 Laravel 8 中通过验证保护模型
问题描述
我有phones
带字段的数据库表phone_number
。我有一个模型电话。我想以固定格式(已清理)和填充phone_number
(已验证)保存电话
代码中有很多地方需要我或我的同事保存手机。我不相信,他们都会费心检查是否phone_number
填写了正确的格式。而且我不想指望前端 JS 验证或数据库NOT NULL
检查,...
所以我认为清理和验证电话的最佳位置将是模型本身。
我怎样才能以最干净的方式在 Laravel 8.x 中做到这一点?
我在互联网上发现了很多这样的问题,但是提出的解决方案要么编写大量代码并将框架弯曲得令人作呕,要么人们根本没有抓住这个问题。
Mabye 我应该补充一点,我希望这会自动发生。因此,任何尝试$phone->save()
或Phone::create()
以错误格式拨打电话的人最终都会收到 ValidationException
编辑 2:提供者/观察者 - 我在寻找正确的方向吗?
编辑 3:事件?所以在我的模型中,我应该这样做:
use Notifiable;
protected $dispatchesEvents = [
'validating' => PhoneSanitize::class,
'saving' => PhoneValidate::class,
];
编辑 4:或者您认为在模型级别验证数据是一个坏主意?我读过这篇文章:
在我看来这是个好主意。但是如何在 Laravel 中实现这一点?
解决方案
在模型级别验证数据是一个坏主意,因为验证逻辑更多的是关于表单请求。
话虽如此,您可以使用Eloquent Mutators来清理(甚至验证)您在模型中的输入。
namespace App\Models;
use Illuminate\Support\Facades\Validator;
class Phone extends Model
{
// ...
public function setPhoneNumberAttribute($value)
{
// Do your sanitization
// ...
// Do your validation
Validator::make([
'phone_number' => $value,
], [
'phone_number' => ['required'], // Define your validation rules
])->validate();
$this->attributes['phone_number'] = $value;
}
// ...
}
如果验证失败,Illuminate\Validation\ValidationException
将抛出 并自动重定向用户,或者在 AJAX 请求的情况下,将返回 JSON 响应。
推荐阅读
- php - VCalendar 和 PHP 发送会议请求,但电子邮件未请求回复
- angular - Primeng的p-fileUpload中没有运行onUpload方法
- bash - 重击。在调用堆栈中插入函数调用
- angular - 使用 Angular 8,如何获取对在页面其余部分加载几秒钟后加载的 DOM 元素的引用?
- google-apps-script - 使用 API 将 Google 幻灯片(和绘图)链接到 Google Doc
- flutter - Flutter:列表滚动上的 sliverAppBar 调整大小问题
- node.js - 带有 NodeJs sdk 版本 4.0 的 Microsoft Bot Framework 不允许多个用户会话
- u-boot - 如何在 Coral 开发板启动期间禁用控制台消息?
- django - 如何在Django2.1的模板内的for循环内设置变量?
- scala - 在 scala 项目中创建 power point 并得到导入错误。导入 org.apache.poi.ss.usermodel。尝试导入 ss 作品