Über das PHP-Framework Laravel habe ich schon relativ viel geschrieben. Seit einiger Zeit ist dieses in der Version 5 erschienen.
Neue Methode der Validierung 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 der Controller beginnt diese zu verarbeiten. Hierzu habe ich bereits einen Artikel geschrieben.
Bild-Validierung für Laravel
Nun gibt es heutzutage ja immer mehr mediale Inhalte und somit kommt man kaum um Bild-Uploads herum. Jede Anwendung braucht Profilbilder, Artikelbilder, Hintergrundbilder und und und. Diese kann Laravel leider nicht von Haus aus validieren. Einen Weg um dennoch Bilder nach Größe zu Validieren zeige ich hier auf:
Voraussetzungen
Um diese ganze Bild-Validation zu machen bediene ich mich einer Library namens Intervention Image.
Die Installation für Laravel wird hier beschrieben. Im wesentlichen müssen wir nur Composer anweisen die Library zu laden:
$ php composer.phar require intervention/image
und anschließend entsprechend in der config/app.php den Provider und Alias hinzufügen:
$providers = [ 'Intervention\Image\ImageServiceProvider', ... ]; $aliases = [ 'Image' => 'Intervention\Image\Facades\Image', ... ]
Schon ist die Library einsatzbereit. Diese könnt ihr übrigens in eurer ganzen Applikation verwenden und bietet weitaus mehr Funktionen als die hier eingesetzten. Ein Blick in die Dokumentation offenbart diese.
Definition der Regeln
Laravel kommt von Haus aus mit einigen Regeln zur Validation. Diese wollen wir nun durch eigene erweitern und packen diese Funktionalität in einen ServiceProvider. Hier definieren wir nun Filter wie: width_larger, width_equal, width_smaller und viele mehr.
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Intervention\Image\Facades\Image; use Validator; class ImageValidationServiceProvider extends ServiceProvider { public function boot() { // Image Width Validator::extend('width_larger', function($attribute, $value, $parameters) { $img = Image::make($value); return ($img->width() > $parameters[0]); }); Validator::extend('width_equal', function($attribute, $value, $parameters) { $img = Image::make($value); return ($img->width() == $parameters[0]); }); Validator::extend('width_smaller', function($attribute, $value, $parameters) { $img = Image::make($value); return ($img->width() < $parameters[0]); }); // more rules... } public function register() { // } }
Service Provider registrieren
Wie auch das Image-Framework müssen wir nun auch den Service-Provider registrieren. Dazu gehen wir wieder in die config/app.php Datei und fügen entsprechend den ImageValidationServiceProvider hinzu:
$providers = [ 'App\Providers\ImageValidationServiceProvider', ... ];
Anwendungsbeispiel
Hier nun ein kleines Beispiel für einen Request, in dem eine Datei mindestens 500px breit, 500px hoch und quadratisch sein soll:
<?php namespace App\Http\Requests; use App\Http\Requests\Request; class TestRequest extends Request { public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'grafik' => 'image|ratio_equal:1|height_larger:499|width_larger:499', ]; } }
Verfügbare Methoden
- width_larger, Bild muss breiter als die angegebene Größe (in Pixel) sein.
- width_smaller, Bild muss schmaler als die angegebene Größe (in Pixel) sein.
- width_equal, Bild muss exakt die angegebene Breite (in Pixel) haben.
- height_larger, Bild muss höher als die angegebene Größe (in Pixel) sein.
- height_smaller, Bild muss kleiner als die angegebene Größe (in Pixel) in der Höhe sein.
- height_equal, Bild muss exakt die angegebene Höhe (in Pixel) haben.
- ratio_smaller, das Größenverhältnis (Quotient aus Breite und Höhe) muss größer als das angegebene sein.
- ratio_smaller, das Größenverhältnis muss kleiner als das angegebene sein.
- ratio_equal, das Größenverhältnis muss exakt dem angegebenen entsprechen.
Download & Dokumentation
Hier auf Github findet sich die ganze Klasse als download. Ebenfalls eine englische Dokumentation.
Kritik & Anregungen
Gerne erweitere ich die Klasse um weitere Regeln. Vorschläge dazu einfach in den Kommentaren oder auf Github erwähnen.