作为程序员一定要保持良好的睡眠,才能好编程

laravel 中validate验证规则

发布时间:2020-03-24


简单写一个验证


$validatedData = $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);



关于数组数据的注意实现

如果你的 HTTP 请求包含一个 「嵌套」 参数(即数组),那你可以在验证规则中通过 「点」 语法来指定这些参数。

author 是一个数组 

$request->validate([
    'title' => 'required|unique:posts|max:255',
    'author.name' => 'required',
    'author.description' => 'required',
]);




错误返回

@if ($errors->any())

    <div class="alert alert-danger">

        <ul>

            @foreach ($errors->all() as $error)

                <li>{{ $error }}</li>

            @endforeach

        </ul>

    </div>

@endif







AJAX 请求 & 验证

在这个例子中,我们使用传统的表单将数据发送到应用程序。但实际情况中,很多程序都会使用 AJAX 来发送请求。当我们对 AJAX 的请求中使用 validate 方法时,Laravel 并不会生成一个重定向响应,而是会生成一个包含所有验证错误信息的 JSON 响应。这个 JSON 响应会包含一个 HTTP 状态码 422 被发送出去。






验证表单请求 创建请求验证类


创建表单请求验证

面对更复杂的验证情境中,你可以创建一个「表单请求」来处理更为复杂的逻辑。表单请求是包含验证逻辑的自定义请求类。

可使用 Artisan 命令 make:request 来创建表单请求类:

php artisan make:request StoreBlogPost

新生成的类保存在 app/Http/Requests 目录下。如果这个目录不存在,运行 make:request 命令时它会被创建出来。让我们添加一些验证规则到 rules 方法中:


/**
 * 获取适用于请求的验证规则。
 *
 * @return array
 */
public function rules()
{
    return [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ];
}

{tip} 你可以向 rules 方法传入所需的任何依赖项。他们会自动被 Laravel 提供的 服务容器 自动解析。


验证规则是如何运行的呢?你所需要做的就是在控制器方法中类型提示传入的请求。在调用控制器方法之前验证传入的表单请求,这意味着你不需要在控制器中写任何验证逻辑:


/**
 * 存储传入的博客文章。
 *
 * @param  StoreBlogPost  $request
 * @return Response
 */
public function store(StoreBlogPost $request)
{
    // 传入的请求通过验证...
    // 获取通过验证的数据...
    $validated = $request->validated();
}

如果验证失败,就会生成一个让用户返回到先前的位置的重定向响应。这些错误也会被闪存到 session 中,以便这些错误都可以在页面中显示出来。如果传入的请求是 AJAX,会向用户返回具有 422 状态代码和验证错误信息的 JSON 数据的 HTTP 响应。




 $validator = Validator::make($request->all(), [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
]);
if ($validator->fails()) {
    return redirect('post/create')
                ->withErrors($validator)
                ->withInput();
}





验证后还可以有钩子 验证后钩子

验证器还允许你添加在验证成功之后允许的回调函数,以便你进行下一步的验证,甚至在消息集合中添加更多的错误消息。使用它只需在验证实例上使用 after 方法:


$validator = Validator::make(...);
$validator->after(function ($validator) {
    if ($this->somethingElseIsInvalid()) {
        $validator->errors()->add('field', 'Something is wrong with this field!');
    }
});
if ($validator->fails()) {
    //
}



处理错误消息


unique 连接数据库验证

unique:table,column,except,idColumn

验证的字段在给定的数据库表中必须是唯一的。如果没有指定 column ,将会使用字段本身的名称。


指定自定义字段


'email' => 'unique:users,email_address'

自定义数据库连接


有时,你可能需要为验证程序创建的数据库查询设置自定义连接。上面的例子中,将 unique:users 设置为验证规则,

等于使用默认数据库连接来查询数据库。如果要对其进行修改,请使用「点」方法指定连接和表名


'email' => 'unique:connection.users,email_address'



自定义验证规则

使用规则对象


Laravel 提供了许多有用的验证规则;同时也支持自定义规则。注册自定义验证规则的方法之一,就是使用规则对象。可以使用 Artisan 命令 make:rule 来生成新的规则对象。接下来,让我们用这个命令生成一个验证字符串是大写的规则。Laravel 会将新的规则存放在 app/Rules 目录中:


php artisan make:rule Uppercase

一旦创建了规则,我们就可以定义它的行为。规则对象包含两个方法: passes 和 message。passes 方法接收属性值和名称,并根据属性值是否符合规则而返回 true 或 false。 message 方法应返回验证失败时应使用的验证错误消息:


<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;

class Uppercase implements Rule{
    /**
     * 判断验证规则是否通过。
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return strtoupper($value) === $value;
    }
    /**
     * 获取验证错误消息。
     *
     * @return string
     */
    public function message()
    {
        return 'The :attribute must be uppercase.';
    }}

当然, 如果你希望从翻译文件中返回一个错误消息,你可以从 message 方法中调用辅助函数 trans:


/**

 * 获取验证错误消息。

 *

 * @return string

 */public function message(){

    return trans('validation.uppercase');}

一旦规则对象被定义好后,你可以通过将规则对象的实例和其他验证规则一起来传递给验证器:


use App\Rules\Uppercase;

$request->validate([

    'name' => ['required', 'string', new Uppercase],]);



隐式扩展

默认情况下, 当所要验证的属性不存在或包含由 required 规则定义的空值时,那么正常的验证规则,包括自定义扩展将不会执行。 例如,unique 规则将不会检验 null 值:


$rules = ['name' => 'unique'];


$input = ['name' => null];


Validator::make($input, $rules)->passes(); // true

如果要求即使为空时也要验证属性,则必须要暗示属性是必须的。要创建这样一个「隐式」扩展, 可以使用 Validator::extendImplicit() 方法:


Validator::extendImplicit('foo', function ($attribute, $value, $parameters, $validator) {

    return $value == 'foo';

});



使用 FormRequest 表单形式进行数据验证:




可用验证规则  https://learnku.com/docs/laravel/5.8/validation/3899


AcceptedActive URLAfter (Date)After Or Equal (Date)AlphaAlpha DashAlpha NumericArrayBailBefore (Date)Before Or Equal (Date)BetweenBooleanConfirmedDateDate EqualsDate FormatDifferentDigitsDigits BetweenDimensions (Image Files)DistinctE-MailExists (Database)FileFilledGreater ThanGreater Than Or EqualImage (File)InIn ArrayIntegerIP AddressJSONLess ThanLess Than Or EqualMaxMIME TypesMIME Type By File ExtensionMinNot InNot RegexNullableNumericPresentRegular ExpressionRequiredRequired IfRequired UnlessRequired WithRequired With AllRequired WithoutRequired Without AllSameSizeStarts WithStringTimezoneUnique (Database)URLUUID



特别声明一下几种用法:


required_if

当id为*** 的时候验证 

'orderId' => [

                    "required_if:id,",

                    'int'

                ],


如果id字段为空,则验证orderId

required_if:id,1,2,3

意思:当id为 1,或者2或者3的时候就验证orderId

案例中 id为空,则证明验证id为空的时候,才验证orderId


required_unless

当type不等于1 的时候,进行验证

required_unless:type,1


required_with


required_with:foo,bar,…

在其他任一指定字段出现时,验证的字段才必须存在且不为空。




required_with_all

required_with_all:foo,bar,…

只有在其他指定字段全部出现时,验证的字段才必须存在且不为空。


required_without

required_without:foo,bar,…

在其他指定任一字段不出现时,验证的字段才必须存在且不为空。



required_without_all

required_without_all:foo,bar,…

只有在其他指定字段全部不出现时,验证的字段才必须存在且不为空。



same:field

验证字段的值必须与给定字段的值相同。












官方验证url地址:


https://learnku.com/docs/laravel/5.8/validation/3899