Kategorien
Development

Laravel 5: Image Validation

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

Von Luke

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

Schreibe einen Kommentar

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