Laravel 5 上表单和模型之间数据验证的最佳方法是什么?
What's the best approach for data validation between forms and models on Laravel 5?
我习惯于在另一个框架中同时进行模型和表单验证。但我正在迁移到 Laravel 并试图了解它的心态。
数据验证的最佳方法是什么?我 seen some classes 帮助创建表单和验证请求,但是让模型保存数据而不事先验证是否不安全?
我如何整合表单(前端)、请求(后端)和模型验证,使它们能够很好地协同工作?还是 Laravel 世界根本没有这样做?
作为Laravel我自己的初学者,我可以说出一个学习者的想法。
首先要理解的是Laravel是非常非常非常非常抽象的。它为您提供了针对单个问题的数千种解决方案。由于您刚刚起步,我假设您使用的是 Laravel 5(更具体地说是 5.1)。
控制器中的 $this->validate()
You can use $this->validate() in your controllers.
class SomeController extends Controller {
public function store(Request $request){
$this->validate($request, [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
// This passed validation.
}
}
验证外观
在 config/app.php
中,您将找到一个 aliases
字段,该字段将验证器外观定义为 'Validator' => Illuminate\Support\Facades\Validator::class
。 You can make validators from basically anywhere.
public function store(Request $request) {
$validator = Validator::make($request->all(), [
'email' => 'required|unique:emails|email',
]);
if ($validator->fails()) {
// Error logic
}
// Store the blog post...
}
表单请求
就个人而言,我喜欢表单请求。它们允许您在您喜欢的任何控制器中重用一次定义的验证逻辑。您可以 运行 在您的项目中
php artisan make:request MyCustomRequest
这将在 app/Http/Requests
内生成一个新请求,您可以在 rules method
内编写规则。然后,当您想使用它时,只需键入提示您的控制器方法即可。
使用方法如下:
public function store(CompanyRequest $request){
// This code will only be executed if the rules inside CompanyRequest
// Are true.
}
这是定义 CompanyRequest 的文件。
class CompanyRequest extends Request {
/**
* 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() {
return [
'name' => 'required|max:255',
'domain' => 'required|max:40'
];
}
}
结论
可能还有几种方法可以做到这一点。例如,您可以在 Eloquent 模型中使用 Validator::make
外观。 Laravel 提供了多种处理基本问题的方法。你只需要找到最适合你的专业。
我不确定这是不是最好的方法。
但我在最流行的 CMS 中使用这个概念及其最流行的验证表单的方式。
像往常一样,表单操作应指向控制器方法。在控制器方法内部,您可以像下面这样初始化验证器 class。
$validation = \Validator::make(\Input::all(), with(new UserValidation)->getRules());
if ($validation->fails()) {
return redirect()->route('your route path ')->withErrors($validation)->withInput();
}
然后在您的控制器中使用命名空间,如 .
use VendorName\PackageName\validations\UserValidation;
在这里,我将验证放在一个名为 validations 的单独文件夹中。另请注意,我在 Laravel 5.x 中使用了包开发概念,您可以阅读更多相关信息 here。
然后在那个 UserValidation class 你可以把所有的验证规则。
class UserValidation {
public function getRules() {
return [
'name' => 'required|max:200|unique:client',
'address'=>'required',
'status' => 'required',
];
}
}
这有几个好处,控制器看起来更整洁,验证自定义将完全是单独的文件。
您也可以将路由拆分到一个单独的文件夹中。
希望它有意义..
最后,我发现解决这个问题的最好方法是将两个 Laravel 扩展拼接在一起:Ardent, an Eloquent extension that includes validation, and a fork of Laravalid,用 jQuery 基本验证扩展表单:那个叉子包括 Ardent 集成。
我习惯于在另一个框架中同时进行模型和表单验证。但我正在迁移到 Laravel 并试图了解它的心态。
数据验证的最佳方法是什么?我 seen some classes 帮助创建表单和验证请求,但是让模型保存数据而不事先验证是否不安全?
我如何整合表单(前端)、请求(后端)和模型验证,使它们能够很好地协同工作?还是 Laravel 世界根本没有这样做?
作为Laravel我自己的初学者,我可以说出一个学习者的想法。
首先要理解的是Laravel是非常非常非常非常抽象的。它为您提供了针对单个问题的数千种解决方案。由于您刚刚起步,我假设您使用的是 Laravel 5(更具体地说是 5.1)。
控制器中的 $this->validate()
You can use $this->validate() in your controllers.
class SomeController extends Controller {
public function store(Request $request){
$this->validate($request, [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
// This passed validation.
}
}
验证外观
在 config/app.php
中,您将找到一个 aliases
字段,该字段将验证器外观定义为 'Validator' => Illuminate\Support\Facades\Validator::class
。 You can make validators from basically anywhere.
public function store(Request $request) {
$validator = Validator::make($request->all(), [
'email' => 'required|unique:emails|email',
]);
if ($validator->fails()) {
// Error logic
}
// Store the blog post...
}
表单请求
就个人而言,我喜欢表单请求。它们允许您在您喜欢的任何控制器中重用一次定义的验证逻辑。您可以 运行 在您的项目中
php artisan make:request MyCustomRequest
这将在 app/Http/Requests
内生成一个新请求,您可以在 rules method
内编写规则。然后,当您想使用它时,只需键入提示您的控制器方法即可。
使用方法如下:
public function store(CompanyRequest $request){
// This code will only be executed if the rules inside CompanyRequest
// Are true.
}
这是定义 CompanyRequest 的文件。
class CompanyRequest extends Request {
/**
* 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() {
return [
'name' => 'required|max:255',
'domain' => 'required|max:40'
];
}
}
结论
可能还有几种方法可以做到这一点。例如,您可以在 Eloquent 模型中使用 Validator::make
外观。 Laravel 提供了多种处理基本问题的方法。你只需要找到最适合你的专业。
我不确定这是不是最好的方法。 但我在最流行的 CMS 中使用这个概念及其最流行的验证表单的方式。
像往常一样,表单操作应指向控制器方法。在控制器方法内部,您可以像下面这样初始化验证器 class。
$validation = \Validator::make(\Input::all(), with(new UserValidation)->getRules());
if ($validation->fails()) {
return redirect()->route('your route path ')->withErrors($validation)->withInput();
}
然后在您的控制器中使用命名空间,如 .
use VendorName\PackageName\validations\UserValidation;
在这里,我将验证放在一个名为 validations 的单独文件夹中。另请注意,我在 Laravel 5.x 中使用了包开发概念,您可以阅读更多相关信息 here。
然后在那个 UserValidation class 你可以把所有的验证规则。
class UserValidation {
public function getRules() {
return [
'name' => 'required|max:200|unique:client',
'address'=>'required',
'status' => 'required',
];
}
}
这有几个好处,控制器看起来更整洁,验证自定义将完全是单独的文件。 您也可以将路由拆分到一个单独的文件夹中。
希望它有意义..
最后,我发现解决这个问题的最好方法是将两个 Laravel 扩展拼接在一起:Ardent, an Eloquent extension that includes validation, and a fork of Laravalid,用 jQuery 基本验证扩展表单:那个叉子包括 Ardent 集成。