Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the best approach for data validation between forms and models on Laravel 5?

I'm used to have model and form validation together, in another framework. But I'm migrating to Laravel and trying to understand its mindset.

What's the best approach for data validation? I've seen some classes that help out on creating forms and validating requests, but isn't it unsafe to have models saving data without validating it before?

How could I integrate form (frontend), request (backend) and model validation so they all play nicely together? Or this is not done in the Laravel world at all?

like image 514
igorsantos07 Avatar asked Sep 16 '25 00:09

igorsantos07


1 Answers

As a starter in Laravel myself, I can tell a mind of a learner.

The first thing to understand is that Laravel is very very very very very abstract. It offers you thousands of solutions for a single problem. Since you're just starting out, I'm going to assume you're using Laravel 5 (5.1 to be more specific).

The $this->validate() from Controllers

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.
      }
}

The Validation Facade

Inside the config/app.php you will find a aliases field that defines the Validator Facade as '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...
}

Form Requests

Personally, I like Form Requests. They allow you to reuse validation logic defined once in any controller you feel like it. You can run in your project

php artisan make:request MyCustomRequest

That will generate a new request inside app/Http/Requests where you can write your rules inside the rules method. And then, when you want to use it, just type-hint your controller method.

Here is how to use it:

public function store(CompanyRequest $request){
    // This code will only be executed if the rules inside CompanyRequest
    // Are true.
}

Here is the file defining 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'
        ];
    }

}

Conclusion

There are probably a few more ways to do it. You can, for instance, use Validator::make facade from within your Eloquent models. Laravel offers multiple ways of handling basic problems. You just have to find what is best for you and major in it.

like image 84
Marco Aurélio Deleu Avatar answered Sep 17 '25 20:09

Marco Aurélio Deleu