规则收集器 2.0 gordensong/laravel-validator 基础篇系列(一)

gordensong/laravel-validator

经过 gordensong/laravel-table-validator 的试水,决定创建一个更加简单实用的版本。

新项目:gitee.com/gordensong/laravel-valid...

用法展示

routes/web.php

Route::post('/user/name-register')
    ->uses([UserController::class, 'nameRegister'])
    ->name('user.name-register');

Route::post('/user/add-addresses')
    ->uses([UserController::class, 'addAddresses'])
    ->name('user.add-addresses');

UserController.php

<?php

namespace App\Http\Controllers;

use App\Validators\Mysql\UsersAddressValidator;
use App\Validators\Mysql\UsersValidator;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function nameRegister(Request $request, UsersValidator $validator): JsonResponse
    {
        $validated = $validator->scene('name-register')->validate($request->all());

        return response()->json($validated);
    }

    public function addAddresses(Request $request, UsersAddressValidator $addressesValidator)
    {
        $validated = $addressesValidator
            ->only('province', 'city', 'district')
            ->prefix('addresses.*')
            ->validate($request->all());

        return response()->json($validated);
    }
}

UserControllerTest.php

<?php

namespace Tests\App\Http\Controllers;

use Tests\TestCase;

class UserControllerTest extends TestCase
{
    public function test_nameRegister($route = 'user.name-register')
    {
        $data = [
            'name' => 'jack',
            'password' => '123456',
            'password_confirmation' => '123456',
        ];

        $this->postJson(route($route), $data)
            ->assertOk()
            ->assertJson([
                'name' => 'jack',
                'password' => '123456',
            ]);
    }

    public function test_addAddresses($route = 'user.add-addresses')
    {
        $data = [
            'addresses' => [
                ['province' => 'PA1', 'city' => 'CA1', 'district' => 'DA1'],
                ['province' => 'PA2', 'city' => 'CA2', 'district' => 'DA2'],
            ],
        ];

        $this->postJson(route($route), $data)
            ->assertOk()
            ->assertJson($data);
    }
}

command

php artisan validator:make {table*} {--connection=mysql}

# output:
#validator       exists : /app/Validators/Mysql/UsersValidator.php
#validator trait created: /app/Validators/Mysql/UsersValidator.php
#...

目录结构

/app

  • /Validators
    • /Mysql
      • /DatabaseRules // 存放表规则
        • UsersValidatorTrait.php // users 表
        • UsersAddressValidatorTrait.php
      • UsersValidator.php // users 表的自定义规则
      • UsersAddressValidator.php

Demo

UsersValidator.php

只生成一次。

<?php

namespace App\Validators\Mysql;

class UsersValidator extends \GordenSong\Laravel\Support\Validator
{
    use \App\Validators\Mysql\DatabaseRules\UsersValidatorTrait;

    public function customizeRules(): array
    {
        return [
            'id' => ['required'],
            'name' => ['required', 'min:3', 'max:50'], // 'min:3', 'max:50' 为自定义规则,
            'password' => ['required'],
            'created_at' => [],
            'updated_at' => [],
        ];
    }

    public function excludeRules(): array
    {
        return [
            'created_at', // 排除验证的字段
            'updated_at',
        ];
    }

    protected $messages = [

    ];

    protected $attributes = [
        // 'id' => '',
        // 'name' => '',
        // 'password' => '',
        // 'created_at' => '',
        // 'updated_at' => '',
    ];

    protected $scenes = [
        'name-register' => ['name', 'password' => 'confirmed'],
    ];
}

UsersValidatorTrait.php

自动生成,每次生成时自动覆盖旧文件。

<?php

namespace App\Validators\Mysql\DatabaseRules;

trait UsersValidatorTrait
{
    public function tableRules(): array
    {
        return [
            'id' => [
                'integer',
                'min:0',
            ],
            'name' => [
                'string',
                'max:255',
            ],
            'password' => [
                'string',
                'max:255',
            ],
            'created_at' => [
                'date',
            ],
            'updated_at' => [
                'date',
            ],
        ];
    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!