其他验证方法
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)
]
];
}
}