laravel-mongodb数据验证规则文档:自动生成工具
概述
laravel-mongodb提供了基于MongoDB的验证规则实现,通过src/Validation/DatabasePresenceVerifier.php和src/Validation/ValidationServiceProvider.php两个核心文件实现了与Laravel验证系统的集成。该工具允许开发者利用MongoDB的特性进行数据验证,包括唯一性检查、存在性验证等常见场景。
核心实现
服务注册
ValidationServiceProvider类继承自Laravel的基础验证服务提供者,通过重写registerPresenceVerifier方法注册了MongoDB特定的验证器:
protected function registerPresenceVerifier()
{
$this->app->singleton('validation.presence', function ($app) {
return new DatabasePresenceVerifier($app['db']);
});
}
数据库存在性验证器
DatabasePresenceVerifier类提供了两个核心方法用于数据验证:
getCount方法
该方法用于检查集合中是否存在具有特定值的对象:
public function getCount($collection, $column, $value, $excludeId = null, $idColumn = null, array $extra = [])
{
$query = $this->table($collection)->where($column, new Regex('^' . preg_quote($value) . '$', '/i'));
if ($excludeId !== null && $excludeId !== 'NULL') {
$query->where($idColumn ?: 'id', '<>', $excludeId);
}
foreach ($extra as $key => $extraValue) {
$this->addWhere($query, $key, $extraValue);
}
return $query->count();
}
getMultiCount方法
该方法支持同时检查多个值的存在性:
public function getMultiCount($collection, $column, array $values, array $extra = [])
{
// Nothing can match an empty array. Return early to avoid matching an empty string.
if ($values === []) {
return 0;
}
// Generates a regex like '/^(a|b|c)$/i' which can query multiple values
$regex = new Regex('^(' . implode('|', array_map(preg_quote(...), $values)) . ')$', 'i');
$query = $this->table($collection)->where($column, 'regex', $regex);
foreach ($extra as $key => $extraValue) {
$this->addWhere($query, $key, $extraValue);
}
return $query->count();
}
使用场景
唯一性验证
在Laravel表单验证规则中使用unique规则时,系统会自动调用DatabasePresenceVerifier的getCount方法:
$rules = [
'email' => 'required|email|unique:users',
'username' => 'required|unique:users,username',
];
存在性验证
使用exists规则验证数据存在性:
$rules = [
'role_id' => 'required|exists:roles,_id',
'status' => 'required|exists:statuses,name',
];
多值验证
通过自定义验证逻辑,可以利用getMultiCount方法实现多值验证:
// 验证tags字段中的所有值都存在于tags集合中
$validator = Validator::make($data, [
'tags' => [
'required',
function ($attribute, $value, $fail) {
$verifier = app('validation.presence');
$count = $verifier->getMultiCount('tags', 'name', $value);
if ($count !== count($value)) {
$fail('One or more tags do not exist.');
}
},
],
]);
正则表达式实现
验证器使用MongoDB的Regex类实现模式匹配,确保验证规则与MongoDB的查询语法兼容:
// 单值匹配
new Regex('^' . preg_quote($value) . '$', '/i')
// 多值匹配
new Regex('^(' . implode('|', array_map(preg_quote(...), $values)) . ')$', 'i')
这种实现确保了验证规则的大小写不敏感,同时正确处理特殊字符。
扩展建议
- 增加对MongoDB特定数据类型的验证支持,如ObjectId、Date等
- 实现更复杂的验证规则,如地理位置验证、数组长度验证等
- 添加缓存机制提高验证性能,特别是在高频验证场景下
- 开发可视化的验证规则生成工具,降低使用门槛
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



