gordensong/laravel-table-validator 資料表欄位驗證收集器

gordensong發表於2021-08-05

做了個小東西,分享給大家。歡迎大家指正。

簡介

這是一個規則收集器。

立專案的:

  1. 解決專案開發中經常遇到字串或數字被截斷的問題。

解決方案:

  1. 表單驗證規則從快取或資料庫表中自動載入。
  2. 開發者可以自定義(擴充套件或覆蓋)欄位的驗證規則。
  3. 相同表不同控制器(場景 scene)需要驗證的表欄位不同。
  4. 開發者可以將不同場景隨意組合使用。

概念

  1. Validator:規則收集器。
  2. TableValidator:表規則收集器。
  3. ValidatorCollection:規則收集器集合。
  4. EmptyValidator:空規則收集器,臨時建立使用。
  5. EmptyTableValidator:空表規則收集器,臨時建立使用。
  6. scene :規則場景。表規則收集器可以合併獲取指定場景規則。規則收集器集合可以分別獲取每個規則收集器的場景規則。

機制

  1. 規則合併優先順序: table rules < $rules < scene rules,優先順序高的規則覆蓋優先順序低的規則。
  2. 同一表欄位規則: required 優先順序最高,排最前面,
  3. 同名規則,高優先順序覆蓋低優先順序。如:table rule max:50, $rules max: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 協議》,轉載必須註明作者和本文連結

相關文章