Kategorien
Web

Laravel 5: Validation / Validierung über Requests

Heißt es Validation oder Validierung? Ich glaube im Kontext der Informatik eher Validation.

Über das PHP-Framework Laravel habe ich schon relativ viel geschrieben. Seit einiger Zeit ist dieses in der Version 5 erschienen. Hierbei hat sich wahrlich einiges Verändert. Eine Änderung möchte ich hier gesondert beleuchten, da sie als Grundlage für einen zukünftigen Beitrag über die Validation von Bildern.

Dieser Artikel soll daher die neuen Methoden zur Validation von Formular-Daten erklären und mit den alten Methoden vergleichen:

Neue Methode der Validation in Laravel 5

In Laravel 4 musste man noch über die Validator-Klasse eigene Objekte zur Validation erzeugen. In Laravel 5 gibt es die schöne Möglichkeit einen sogenannten Request zu verwenden um die Daten zu prüfen bevor sie im Controller verwendet werden. Hierbei bedient man sich der Method-Injection, die in Laravel nun noch aktiver umgesetzt wurde als bisher. Wie das genau funktioniert werde ich hier nicht erklären, da das ein Thema für sich ist.

Wie funktioniert es also? In einer neuen Klasse, dem Request, werden die Validationsregeln und Fehlermeldungen festgelegt. Diese wird dem Controller als Objekt übergeben und erhält dann die bereits validierten Daten. Im Controller ist sie quasi der Ersatz für die bisher statische Input-Klasse.

Die Validation findet statt bevor der Controller aufgerufen wird. Stimmen die Daten also nicht mit den Regeln überein findet ein Redirect zurück mit entsprechenden Fehlermeldungen statt. Die Methode im Controller wird in diesem Fall nicht aufgerufen. Das erhöht die Sicherheit.

Validation im Laravel 4 vs. Laravel 5

Wie sieht das nun praktisch aus?

Laravel 4: Validation im Controller

In Laravel 4 sah der Code wie folgt aus:

class TestController {
	
	public function store(){
		$validator = Validator::make(
		    Input::all(),
		    [
		        'name' => 'required',
		        'password' => 'required|min:8',
		        'email' => 'required|email|unique:users'
		    ]
		);

		if ($validator->fails())
		{
		    return Redirect::back()->withErrors()->withInput();
		}
	}
}

Im Controller wird ein Objekt über Validator::make erstellt, dem sowohl die Daten (Input::all()), als auch die Regeln übergeben werden. Nun kann der Validator die Daten prüfen und im Controller definieren wir selber entsprechende Redirects usw.

Laravel 5: Validation im Request

Wie sieht das nun in Laravel 5 aus? Hier erstellen als erstes einen neuen Request. Dies tun wir mittels artisan im Terminal.

php artisan make:request TestRequest

Nun füllen wir die neu erstellte Klasse (app/Http/Requests/TestRequest.php) mit unseren Regeln:

class TestRequest extends Request
{
    public function authorize()
    {
        return true;
    }
   
    public function rules()
    {
        return [
            'name' => 'required',
            'password' => 'required|min:8',
            'email' => 'required|email|unique:users'
        ];
    }
}

Neben den Regeln können wir hier auch eine Autorisierung vornehmen. In der Methode authorize() geben wir true oder false zurück, je nachdem ob der User für diese Handlung berechtigt ist. In diesem Fall geben wir einfach true zurück. Alternativ könnte man zB über „return Auth::check();“ den Zugriff nur auf eingeloggte User beschränken. Die zweite Methode rules() gibt die Regeln zur Validation zurück. Über die Methode messages() könnte man zusätzlich noch eigene Fehlermeldungen ausgeben.

Nun übergeben wir der entsprechenden Methode im Controller (app/Http/Controller/TestController.php) unseren Request:

class TestController extends BaseController {

	public function store(TestRequest $request){
		$test = new Test();

		$test->fill($request->all());

		$test->save();

	}
}

Wie man sieht müssen wir keine Validation mehr im Controller machen. Diese ist bereits im Request erfolgt. Nur bei erfolgreicher Validation bekommt der Controller das Request-Objekt übergeben.

Das Request-Objekt dient nun im Controller als Ersatz für Input. Die Syntax ist kompatibel.

Die Request-Klassen sind übrigens wiederverwendbar. Oft kann man den selben Request für die store und update-Methode verwenden und vermeidet so effektiv doppelten Code.

Laravel 5: Weitere Möglichkeiten

Natürlich funktioniert der Laravel 4-Ansatz über Validator::make() noch immer. Außerdem kann auch im Controller direkt über $this das Validator-Objekt aufgerufen werden.

public function store(Request $request)
{
    $this->validate($request, [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);
}

Meiner Meinung nach ist die Methode über den Request allerdings deutlich sauberer. Außerdem kann man natürlich in der rules-Methode des Requests auch Logik platzieren und die Regeln zB. je nach Vorhandensein anderer Felder variieren lassen:

    public function rules()
    {
        $rules = [
            'name' => 'required',
            'password' => 'required|min:8',
            'email' => 'required|email|unique:users'
        ];

        if($this->has('password_confirmation')){
            $rules['password_confirmation'] = 'same:password';
        }

        return $rules
    }

Fazit

Laravel 5 bietet mit den Requests eine neue und deutlich sauberere, sicherere und wiederverwendbarere Lösung zur Validieren von Anfragen.

Im Laufe der Woche werde ich noch eine eigene Erweiterung posten, die es ermöglicht Bilder auf Größe usw. zu validieren.

Von Luke

Blogautor, Webdesigner, Programmierer, Tontechniker, Kameramann, Musiker, Christ, und vieles mehr

2 Antworten auf „Laravel 5: Validation / Validierung über Requests“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.