其他验证方法

1)表单请求验证

你可以创建一个表单请求,它可以保存应用程序中特定请求的授权逻辑,验证规则和错误消息。

make:request Artisan CLI 命令生成类并将其放在 app/Http/Requests 目录中:

php artisan make:request StoreBlogPostRequest

可以使用此请求的授权逻辑覆盖 authorize 方法:

public function authorize()
{        
    return $this->user()->can('post');
}

可以使用此请求的特定规则覆盖 rules 方法:

public function rules()
{
    return [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ];
}

可以使用此请求的特定消息覆盖 messages 方法:

public function messages()
{
    return [
        'title.required' => 'A title is required',
        'title.unique' => 'There is another post with the same title',
        'title.max' => 'The title may not exceed :max characters',
        'body.required' => 'A message is required',
    ];
}

为了验证请求,只需在相应的控制器方法上键入提示特定的请求类。如果验证失败,将发送错误响应。

public function store(StoreBlogPostRequest $request)
{
    // validation passed
}

2)手动创建验证器

为了获得更大的灵活性,你可能需要手动创建 Validator,并直接处理失败的验证:

<?php    
namespace App\Http\Controllers;

use Validator;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class PostController extends Controller
{
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ]);

        if ($validator->fails()) {
            return redirect('post/create')
                    ->withErrors($validator)
                    ->withInput();
        }

        // Store the blog post...
    }
}

2)流利地创建规则

有时你可能需要动态创建独特的规则,在服务提供商中使用 boot() 方法可能会超出顶部,从 Laravel 5.4 开始,你可以使用 Rule 类流畅地创建新规则。

作为一个例子,当你想插入或更新用户时,我们将使用 UserRequest。现在我们想要一个名字,电子邮件地址必须是唯一的。使用 unique 规则的问题在于,如果你正在编辑用户,他们可能会保留相同的电子邮件,因此你需要从规则中排除当前用户。以下示例显示了如何通过使用新的 Rule 类轻松完成此操作。

<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;

class UserRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules(Request $request)
    {
        $id = $request->route()->getParameter('user');

        return [
            'name'           =>  'required',
            
            // Notice the value is an array and not a string like usual
            'email'         =>  [
                'required',
                Rule::unique('users')->ignore($id)
            ]
        ];
    }
}