做了個小東西,分享給大家。歡迎大家指正。
簡介
這是一個規則收集器。
立專案的:
- 解決專案開發中經常遇到字串或數字被截斷的問題。
解決方案:
- 表單驗證規則從快取或資料庫表中自動載入。
- 開發者可以自定義(擴充套件或覆蓋)欄位的驗證規則。
- 相同表不同控制器(場景 scene)需要驗證的表欄位不同。
- 開發者可以將不同場景隨意組合使用。
概念
Validator
:規則收集器。TableValidator
:表規則收集器。ValidatorCollection
:規則收集器集合。EmptyValidator
:空規則收集器,臨時建立使用。EmptyTableValidator
:空表規則收集器,臨時建立使用。scene
:規則場景。表規則收集器可以合併獲取指定場景規則。規則收集器集合可以分別獲取每個規則收集器的場景規則。
機制
- 規則合併優先順序:
table rules
<$rules
<scene rules
,優先順序高的規則覆蓋優先順序低的規則。 - 同一表欄位規則:
required
優先順序最高,排最前面, - 同名規則,高優先順序覆蓋低優先順序。如:table rule
max:50
, $rulesmax:30
,最終結果是max:30
。
使用
demo
/**
* id, username,
*/
class AuthorValidator extends \GordenSong\Support\TableValidator {
protected $table = 'author';
protected $rules = [
'username' => ['min:1', 'max:255'],
'age' => ['min:0', 'max:150']
];
protected $scenes = [
'new' => ['username' => ['required']],
'age' => ['id', 'age'],
];
}
class BookValidator extends \GordenSong\Support\TableValidator {
protected $table = 'book';
protected $rules = [
'title' => ['min:1', 'max:255'],
'bar_code' => ['nullable', 'size:13'],
];
protected $scenes = [
'new' => ['title', 'bar_code'],
'bar_code' => ['id', 'bar_code'],
];
}
$authorValidator = new AuthorValidator();
$rules = $authorValidator->scene('new', 'age');
// $rules: ['id' => ?, 'username' => ?, 'age' => ?]
$collect = \GordenSong\Support\ValidatorCollection::make(new AuthorValidator(), new BookValidator());
$sceneRules = $collect->scene('new'); // 合併規則覆蓋 collect->rules
// $sceneRules : [
// 'username' => [...], // author's
// 'title' => [...], 'bar_code' => [...] // book's
// ]
$validatedData =$collect->laravelValidator($request->all())->validated();
Register service provider
config/app.php
- providers
GordenSong\Providers\LaravelModelValidatorServiceProvider::class,
Command
validator
validator:cache {connection} Generate one or more table validator cache
validator:make {table*} {--connection=mysql} [options] <table>... Generate one or more table validators
生成 Validator
預設檔案位置: app/Validators/BooksValidator.php
php artisan validator:make . # 為預設資料庫所有的表自動生成 Validator
php artisan validator:make tablename # 為指定表生成 Validator
php artisan validator:make tablename --force # overwrite the file
php artisan validator:make tablename --force --connection=mysql
快取表規則
php artisan validator:cache {connection} {-d}
-d 刪除快取
# bootstrap/cache/table-validator/mysql.php
php artisan validator:cache mysql
Validator 繼承關係
具體功能參考單元測試。
abstract class Validator
{
// trait ValidatorTrait
protected $attributes = [];
protected $messages = [];
protected $rules = [];
public function attributes(): array {}
/**
* @return array
*/
public function rules(): array {}
public function messages(): array {}
public function setAttributes(array $attributes): void {}
public function setMessages(array $messages): void {}
public function setRules(array $rules){}
// trait SceneTrait
protected $scenes = [];
public function setScenes(array $scenes) {}
public function getScene(string $name): array {}
public function addScene(string $name, array $fields) {}
public function scene(string ...$scenes): array {} // merge scene rules
}
abstract class TableValidator extends Validator
{
protected $table = ?;
protected $connection = ?;
protected $model = Model class;
public function getTable(): string {}
public function getConnection(): ?string {}
public function tableRules(): array {}
}
// 自定義表規則
class EmptyTableValidator extends TableValidator
{
public function __construct(string $table, string $connection = null){}
}
class ValidatorCollection
{
// trait ValidatorTrait
public function __construct(Validator ...$validators) {}
public static function make(Validator ...$validators): ValidatorCollection {}
public function add(Validator $validator): ValidatorCollection {}
// 直接修改 $this->rules;
public function required(...$fields): ValidatorCollection {}
public function exclude(...$fields): ValidatorCollection {}
public function only(...$fields): ValidatorCollection {}
// 直接修改 $this->rules;
public function addRules(array $rules): ValidatorCollection {}
public function addRule(string $key, $rules): ValidatorCollection {}
public function getRule(string $key) {}
public function prefix(string $prefix): ValidatorCollection {}
// 1. 獲取每個 validator 的 scene 列表規則的並集
// 2. 覆蓋 $this->rules
public function scene(string ...$scene): array {}
public function laravelValidator(array $data): \Illuminate\Contracts\Validation\Validator {}
}
table validator file
<?php
namespace App\Validators;
class BooksValidator extends \GordenSong\Support\TableValidator
{
protected $table = 'books';
protected $rules = [
// todo overwrite default rules
];
protected $messages = [
// todo: 自定義
];
protected $attributes = [
'title' => '書名'
];
protected $scenes = [
'title' => ['id', 'title'],
'price' => ['price'],
];
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結