编程练习:laravel 中validate验证规则

2020-03-2811:13:29后端程序开发Comments3,959 views字数 4851阅读模式

简单写一个验证

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

关于数组数据的注意实现

如果你的 HTTP 请求包含一个 「嵌套」 参数(即数组),那你可以在验证规则中通过 「点」 语法来指定这些参数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

author 是一个数组文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

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

错误返回

@if ($errors->any())文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

<div class="alert alert-danger">文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

<ul>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

@foreach ($errors->all() as $error)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

<li>{{ $error }}</li>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

@endforeach文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

</ul>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

</div>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

@endif文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

AJAX 请求 & 验证

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

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

创建表单请求验证文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

面对更复杂的验证情境中,你可以创建一个「表单请求」来处理更为复杂的逻辑。表单请求是包含验证逻辑的自定义请求类。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

可使用 Artisan 命令 make:request 来创建表单请求类:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

php artisan make:request StoreBlogPost

新生成的类保存在 app/Http/Requests 目录下。如果这个目录不存在,运行 make:request 命令时它会被创建出来。让我们添加一些验证规则到 rules 方法中:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

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

{tip} 你可以向 rules 方法传入所需的任何依赖项。他们会自动被 Laravel 提供的 服务容器 自动解析。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

验证规则是如何运行的呢?你所需要做的就是在控制器方法中类型提示传入的请求。在调用控制器方法之前验证传入的表单请求,这意味着你不需要在控制器中写任何验证逻辑:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

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

如果验证失败,就会生成一个让用户返回到先前的位置的重定向响应。这些错误也会被闪存到 session 中,以便这些错误都可以在页面中显示出来。如果传入的请求是 AJAX,会向用户返回具有 422 状态代码和验证错误信息的 JSON 数据的 HTTP 响应。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

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

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

验证器还允许你添加在验证成功之后允许的回调函数,以便你进行下一步的验证,甚至在消息集合中添加更多的错误消息。使用它只需在验证实例上使用 after 方法:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

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

处理错误消息文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

unique 连接数据库验证

unique:table,column,except,idColumn文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

验证的字段在给定的数据库表中必须是唯一的。如果没有指定 column ,将会使用字段本身的名称。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

指定自定义字段文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

'email' => 'unique:users,email_address'文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

自定义数据库连接文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

有时,你可能需要为验证程序创建的数据库查询设置自定义连接。上面的例子中,将 unique:users 设置为验证规则,文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

等于使用默认数据库连接来查询数据库。如果要对其进行修改,请使用「点」方法指定连接和表名文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

'email' => 'unique:'文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

自定义验证规则

使用规则对象文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

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

php artisan make:rule Uppercase文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

一旦创建了规则,我们就可以定义它的行为。规则对象包含两个方法: passes 和 message。passes 方法接收属性值和名称,并根据属性值是否符合规则而返回 true 或 false。 message 方法应返回验证失败时应使用的验证错误消息:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

<?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:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

/**文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

* 获取验证错误消息。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

*文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

* @return string文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

*/public function message(){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

return trans('');}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

一旦规则对象被定义好后,你可以通过将规则对象的实例和其他验证规则一起来传递给验证器:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

use App\Rules\Uppercase;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

$request->validate([文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

'name' => ['required', 'string', new Uppercase],]);文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

隐式扩展

默认情况下, 当所要验证的属性不存在或包含由 required 规则定义的空值时,那么正常的验证规则,包括自定义扩展将不会执行。 例如,unique 规则将不会检验 null 值:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

$rules = ['name' => 'unique'];文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

$input = ['name' => null];文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

Validator::make($input, $rules)->passes(); // true文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

如果要求即使为空时也要验证属性,则必须要暗示属性是必须的。要创建这样一个「隐式」扩展, 可以使用 Validator::extendImplicit() 方法:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

Validator::extendImplicit('foo', function ($attribute, $value, $parameters, $validator) {文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

return $value == 'foo';文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

});文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

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

可用验证规则

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文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

特别声明一下几种用法:

required_if

当id为*** 的时候验证文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

'orderId' => [文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

"required_if:id,",文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

'int'文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

],文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

如果id字段为空,则验证orderId文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

required_if:id,1,2,3文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

意思:当id为 1,或者2或者3的时候就验证orderId文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

案例中 id为空,则证明验证id为空的时候,才验证orderId文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

required_unless

当type不等于1 的时候,进行验证文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

required_unless:type,1文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

required_with

required_with:foo,bar,…文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

在其他任一指定字段出现时,验证的字段才必须存在且不为空。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

required_with_all

required_with_all:foo,bar,…文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

只有在其他指定字段全部出现时,验证的字段才必须存在且不为空。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

required_without

required_without:foo,bar,…文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

在其他指定任一字段不出现时,验证的字段才必须存在且不为空。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

required_without_all

required_without_all:foo,bar,…文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

只有在其他指定字段全部不出现时,验证的字段才必须存在且不为空。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

same:field

验证字段的值必须与给定字段的值相同。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

官方验证url地址:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/17956.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/17956.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定