在非 laravel 项目中使用 laravel 的特性 2: 验证器 Validator

laravel validator

安装

composer require illuminate/validation

引入提示消息

项目根目录创建 lang/zh_cn/validation.php 文件

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | The following language lines contain the default error messages used by
    | the validator class. Some of these rules have multiple versions such
    | as the size rules. Feel free to tweak each of these messages here.
    |
    */

    'accepted' => ':attribute必须接受',
    'active_url' => ':attribute必须是一个合法的 URL',
    'after' => ':attribute 必须是 :date 之后的一个日期',
    'after_or_equal' => ':attribute 必须是 :date 之后或相同的一个日期',
    'alpha' => ':attribute只能包含字母',
    'alpha_dash' => ':attribute只能包含字母、数字、中划线或下划线',
    'alpha_num' => ':attribute只能包含字母和数字',
    'array' => ':attribute必须是一个数组',
    'before' => ':attribute 必须是 :date 之前的一个日期',
    'before_or_equal' => ':attribute 必须是 :date 之前或相同的一个日期',
    'between' => [
        'numeric' => ':attribute 必须在 :min 到 :max 之间',
        'file' => ':attribute 必须在 :min 到 :max KB 之间',
        'string' => ':attribute 必须在 :min 到 :max 个字符之间',
        'array' => ':attribute 必须在 :min 到 :max 项之间',
    ],
    'boolean' => ':attribute字符必须是 true 或false, 1 或 0 ',
    'confirmed' => ':attribute 二次确认不匹配',
    'date' => ':attribute 必须是一个合法的日期',
    'date_format' => ':attribute 与给定的格式 :format 不符合',
    'different' => ':attribute 必须不同于 :other',
    'digits' => ':attribute必须是 :digits 位.',
    'digits_between' => ':attribute 必须在 :min 和 :max 位之间',
    'dimensions' => ':attribute具有无效的图片尺寸',
    'distinct' => ':attribute字段具有重复值',
    'email' => ':attribute必须是一个合法的电子邮件地址',
    'exists' => '选定的 :attribute 是无效的.',
    'file' => ':attribute必须是一个文件',
    'filled' => ':attribute的字段是必填的',
    'image' => ':attribute必须是 jpeg, png, bmp 或者 gif 格式的图片',
    'in' => '选定的 :attribute 是无效的',
    'in_array' => ':attribute 字段不存在于 :other',
    'integer' => ':attribute 必须是个整数',
    'ip' => ':attribute必须是一个合法的 IP 地址。',
    'json' => ':attribute必须是一个合法的 JSON 字符串',
    'max' => [
        'numeric' => ':attribute 的最大长度为 :max 位',
        'file' => ':attribute 的最大为 :max',
        'string' => ':attribute 的最大长度为 :max 字符',
        'array' => ':attribute 的最大个数为 :max 个.',
    ],
    'mimes' => ':attribute 的文件类型必须是 :values',
    'min' => [
        'numeric' => ':attribute 的最小长度为 :min 位',
        'file' => ':attribute 大小至少为 :min KB',
        'string' => ':attribute 的最小长度为 :min 字符',
        'array' => ':attribute 至少有 :min 项',
    ],
    'not_in' => '选定的 :attribute 是无效的',
    'numeric' => ':attribute 必须是数字',
    'present' => ':attribute 字段必须存在',
    'regex' => ':attribute 格式是无效的',
    'required' => ':attribute 字段必填',
    'required_if' => ':attribute 字段是必须的当 :other 是 :value',
    'required_unless' => ':attribute 字段是必须的,除非 :other 是在 :values 中',
    'required_with' => ':attribute 字段是必须的当 :values 是存在的',
    'required_with_all' => ':attribute 字段是必须的当 :values 是存在的',
    'required_without' => ':attribute 字段是必须的当 :values 是不存在的',
    'required_without_all' => ':attribute 字段是必须的当 没有一个 :values 是存在的',
    'same' => ':attribute和:other必须匹配',
    'size' => [
        'numeric' => ':attribute 必须是 :size 位',
        'file' => ':attribute 必须是 :size KB',
        'string' => ':attribute 必须是 :size 个字符',
        'array' => ':attribute 必须包括 :size 项',
    ],
    'string' => ':attribute 必须是一个字符串',
    'timezone' => ':attribute 必须是个有效的时区.',
    'unique' => ':attribute 已存在',
    'url' => ':attribute 无效的格式',

    /*
    |--------------------------------------------------------------------------
    | Custom Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | Here you may specify custom validation messages for attributes using the
    | convention "attribute.rule" to name the lines. This makes it quick to
    | specify a specific custom language line for a given attribute rule.
    |
    */

    'custom' => [
        'attribute-name' => [
            'rule-name' => 'custom-message',
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | Custom Validation Attributes
    |--------------------------------------------------------------------------
    |
    | The following language lines are used to swap attribute place-holders
    | with something more reader friendly such as E-Mail Address instead
    | of "email". This simply helps us make messages a little cleaner.
    |
    */

    'attributes' => [
        // 'name'         => '名字',
        // 'age'         => '年龄',
    ],

];

## 封装 handler src/Handlers/Validator.php

  • $translation_path 定位到刚刚创建的 lang 目录
  • $translation_locale 为多语言目录名,即 zh_cn
<?php

namespace App\Handlers;

use Illuminate\Filesystem\Filesystem;
use Illuminate\Translation\FileLoader;
use Illuminate\Translation\Translator;
use Illuminate\Validation\Factory;

class Validator extends Factory
{
    /**
     * 创建实例
     *
     * @return Factory
     */
    public static function getInstance()
    {
        static $validator = null;
        if ($validator === null) {
            $translation_path = __DIR__ . '/../../lang';
            $translation_locale = 'zh_cn';
            $translation_file_loader = new FileLoader(new Filesystem(), $translation_path);
            $translator = new Translator($translation_file_loader, $translation_locale);
            $validator = new Factory($translator);
        }
        return $validator;
    }
}

composer.json 文件添加自动加载,并执行 composer du

{
  "autoload": {
    .
    .
    .
    "psr-4": {
      "App\\": "src"
    }
  }
}

使用

直接使用 index/validator.php

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use App\Handlers\Validator;

// 接参
$data['title'] = '1234567890';
$data['content'] = '123';

// 验证 可惜不能直接抛出异常,留个坑
$validator = Validator::getInstance()->make($data, [
    'title' => 'required|min:10',
    'content' => 'required|min:10',
]);

if ($validator->fails()) {
    dd($validator->errors()->all());
}

dd('success');

命令行开启服务 php -S localhost:8000 并访问 http://localhost:8000/index/validator.php 即可。

自定义消息提示和定义属性名称

// 接参
$data['title'] = '1234567890';
$data['content'] = '123';

// 规则
$rules = [
    'title' => 'required|min:10',
    'content' => 'required|min:10',
];
// 自定义消息提示
$messages = [
    'title.required' => ':title字段必须',
];
//属性名称
$attributes = [
    'title' => '标题',
    'content' => '内容',
];
// 验证
$validator = Validator::getInstance()->make($data, $rules, $messages, $attributes);

PS:验证规则请前往 Laravel Validator 文档 查看

项目目录结构

# tree -I vendor
.
├── composer.json
├── composer.lock
├── config
├── helpers
│   └── laravel_helpers.php
├── index
│   ├── dd.php
│   └── validator.php
├── lang
│   └── zh_cn
│       └── validation.php
└── src
    └── Handlers
        └── Validator.php

finish!

参考 致谢

  1. 在非 Laravel 项目中使用 Validator 验证器
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

直接升级成返回 json,完美

3年前 评论

不能抛出异常 我看源码 可以追加一个validate方法

Validator::getInstance()->make($data, [
    'title' => 'required|min:10',
    'content' => 'required|min:10',
])->validate();

或者直接使用validate

Validator::getInstance()->validate($data, [
    'title' => 'required|min:10',
    'content' => 'required|min:10',
]);
3年前 评论

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