Form Requests
当你构建您的应用时,在你的控制器方法中, 您可能会注意到一些相同的模式。 是的,有一些模式是重复的,例如,输入验证、用户身份验证和授权,以及重定向都用可能。 如果您想要一种结构, 从控制器方法中提取并规范化这些共同的行为模式,您可能会对 Laravel 的 Form Requests 感兴趣.
一个 form request 是一个自定义的处理表单提交的请求类, 这个类的主要任务是: 校验请求, 校验授权用户, 处理校验失败的重定向. 通常(但不是总是), 一个表单请求会映射一个单独的 http 请求.
创建
php artisan make:request CreateCommentRequest
现在, 你已经有可一个 app/Http/Requests/CreateCommentRequest.php.
每个 Form Request 都提供一到两个方法, 第一个 rules(), 返回一个包含验证规则的数组; 第二个 authorize() , 如果返回 true 表示用户是授权访问这个请求, 反之 返回 false 用户是被拒绝的.
例如:
<?php
namespace App\Http\Requests;
use App\BlogPost;
use Illuminate\Foundation\Http\FormRequest;
class CreateCommentRequest extends FormRequest
{
public function authorize()
{
$blogPostId = $this->route('blogPost');
return auth()->check() && BlogPost::where('id', $blogPostId)
->where('user_id', auth()->id())->exists();
}
public function rules()
{
return [
'body' => 'required|max:1000',
];
}
authorize() 方法, 我们先请求名叫 blogPost 的路由, 然后校验用户是否登录, 如果登录, 是否存在与用户相关的 blogpost ; 如果登录且存在, 则可以创建 comment, 否则 返回 false, 意味着没有别授权. 返回一个 403 Forbidden 错误.
rules() 就是校验用户输入, validate() 一样. 未通过, 将用户重定向到上一个
页面并保留其输入和错误消息.
使用 Form Request
就像使用 Request 一样, 把 Form Request 作为参数传递给任意路由的闭包或者控制器方法即可.
// 闭包
Route::post('comments', function (App\Http\Requests\CreateCommentRequest $request) {
// Store comment
});
// or 控制器中
public function store(App\Http\Requests\CreateCommentRequest $request)
{
//
}
