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::classYou 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 集成。