Meer dan ooit tevoren is het cruciaal dat de data in je applicaties gevalideerd en nauwkeurig zijn, en voldoen aan alle systeemeisen. Het gaat immers om de noodzaak om data consistent te houden en beveiligingsproblemen te vermijden.

Laravel maakt datavalidatie eenvoudig en intuïtief. Het volgt een model view controller (MVC) architectuur en vereist alleen algemene kennis van PHP en concepten van object-georiënteerd programmeren (OOP). Bovendien biedt Laravel verschillende methoden voor het valideren van binnenkomende data.

Ontdek enkele van deze benaderingen en hoe je validatieregels kunt toepassen op je dataset.

Eenvoudige datavalidatie met Laravel

Laravel biedt verschillende kant-en-klare validatieregels voor wanneer gebruikers van je applicatie data invoeren via formulieren. Je kunt invoervelden als verplicht markeren, een minimale of maximale lengte instellen, en unieke (niet-dubbele) invoer en geldige e-mailadressen vereisen. De Laravel validator controleert of de invoer voldoet aan deze regels of andere die je opgeeft.

Deze Laravel validatieregels zijn onder andere:

  • required – De velddata mogen niet nul of leeg zijn.
  • array – De velddata moeten een PHP array zijn.
  • bail – De validatieregel stopt met uitvoeren nadat hij zijn eerste validatiefout tegenkomt.
  • email – De velddata moeten een geldig e-mailadres zijn.
  • unique – De velddata mogen geen duplicaten hebben in de databasetabel.

Alle validatiemethoden hebben voor- en nadelen, maar je kunt het beste de aanpak kiezen die bij jouw behoeften aansluit. Afhankelijk van je gekozen methode kan Laravel validatie op verschillende manieren plaatsvinden, met handmatige of automatische foutmeldingen.

De meest voorkomende methode is validate, gebruikt voor inkomende HTTP verzoeken. Deze methode wordt gekoppeld aan de verzoekdata, waarbij de validatieregels worden uitgevoerd. Je kunt de regels voor elk veld scheiden met komma’s, zoals in onderstaand voorbeeld.

use Illuminate\Http\Request;
 
public function store (Request $request){
  $validated = $request->validate([
        'email' => ['required, unique:users, email, bail'],
        'name' => ['required'],
    ]);

}

Hier is email een verplichte invoer, wat betekent dat het niet nul kan zijn. Bovendien moet het uniek zijn in de database tabel users, zodat hetzelfde e-mailadres niet twee keer wordt geregistreerd. De laatste regel schrijft voor dat het e-mailadres ook geldig moet zijn. Anders stopt het validatieproces. Het naamveld is verplicht, maar heeft geen andere regels.

Als een Laravel validatieregel faalt, wordt automatisch een antwoord gegenereerd.

Basisprincipes van validatie

Om de validatiemethoden beter te begrijpen, kun je het volgende voorbeeld bekijken. Je definieert een route voor het endpoint en maakt een controller om de verzoekdata te valideren en te verwerken.

Maak eerst een eenvoudig endpoint dat gebruikers in staat stelt hun e-mails en wachtwoorden op te slaan.

Definieer de route

Laravel routes worden gedefinieerd in het bestand routes/web.php voor een webapplicatie of routes/api.php voor een API. Gebruik voor dit voorbeeld api.php:

use App\Http\Controllers\UserController;
 
Route::post('/store', [UserController::class]);

Maak de controller aan

Voer dit Artisan commando uit om de controller aan te maken:

php artisan make:controller

UserController

Dit commando maakt een UserController.php bestand in de app/Http/Controllers map.

Definieer nu een store methode om data die het store eindpunt binnenkomen te valideren voordat ze worden opgeslagen.

Dit voorbeeld zal de volgende velden valideren met behulp van deze regels:

  • email – Moet uniek zijn, een geldig e-mailadres, en moet verplicht zijn
  • password – Moet een minimale lengte hebben, bevestiging van het wachtwoord, en moet verplicht zijn
  • age – Moet een getal zijn en moet verplicht zijn
<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
    /**
     * Store new user details.
     *
     */
    public function store(Request $request){
        $validated = $request->validate([
            'email' => 'required|unique:users|email',
            'age' => 'required|numeric',
            'password' => 'required|min:7|confirmed'
        ]);
        // After user data is validated, logic to store the data
    }

}

Met de regel confirmed kun je een bepaald veld tweemaal verplichten om te controleren of de data juist zijn, zoals gebruikers die hun wachtwoord opnieuw invoeren tijdens de registratie. Deze regel vereist een veld genaamd password_confirmation, waarvan de data moeten overeenkomen met het password veld.

Foutmeldingen weergeven

Als aan de validatiecriteria is voldaan, loopt je code normaal door. Als de validatie mislukt, wordt een IlluminateValidationValidationException uitzondering gegeven, en wordt de juiste foutmelding teruggegeven.

Het voorbeeld is gebaseerd op een API, die een 422 Unprocessable Entity HTTP antwoord geeft in JSON format. Voor webapplicaties zou het doorverwijzen naar de vorige URL om de foutmelding weer te geven, en de verzoekdata naar de sessie te flitsen.

Je kunt de variabele $errors gebruiken in je views om geretourneerde fouten weer te geven:

@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

Je kunt er ook voor kiezen om alleen de eerste fout weer te geven of door te loopen om ze allemaal te bekijken.

// Fetch all errors
$errors->all()

// Fetch only the first error
$errors->first()

Formulieren opnieuw vullen

Het opnieuw invullen van formulieren bespaart gebruikers het overtypen van informatie, zodat ze zich kunnen concentreren op het oplossen van de fout. In het voorbeeld van een falend e-mailadres kun je de rest van het formulier opnieuw vullen door de oude waarde voor het veld name te callen.

$name = $request-> old('name')

//Blade helper
<input type="text" name="name" value="{{ old('name') }}">

Deze regel zou null teruggeven als er geen eerdere invoer was.

Geavanceerde validatie

Laravel biedt een andere methode om validaties te schrijven, genaamd form requests. Een form request is een aangepaste request klasse die validaties organiseert en je controller inricht.

Ze hebben hun eigen validatie- en autorisatielogica die geschikt is voor grote input-hoeveelheden en kunnen worden gebruikt om validatieregels te definiëren en foutmeldingen te customizen.

Om een form request te maken voer je dit Artisan commando uit:

php artisan make:request StoreUserRequest

Dit commando maakt een StoreUserRequest.php bestand aan in de app/Http/Requests map en bevat twee standaard methodes:

  • rules retourneert validatieregels voor request data.
  • authorize geeft een boolean terug om aan te geven of die gebruiker toestemming heeft om de gevraagde actie uit te voeren.

Converteer het vorige voorbeeld naar een form request.

<?php

namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreUserRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        // Add logic to check if the user is authorized to submit this data.
        return true;
    }
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, mixed>
     */
    public function rules()
    {
        return [
            'email' => 'required|unique:users|email',
            'age' => 'required|numeric',
            'password' => 'required|min:7|confirmed'
        ];
    }

}

Om de foutmeldingen van deze regels aan te passen, kun je de methode messages in de klasse FormRequest overschrijven.

/**

     * Get the error messages for the defined validation rules.
     *
     * @return array
     */
    public function messages()
    {
        return [
            'email.required' => 'An email address is required',
            'email.email' => 'The email address must be valid',
            'password.confirmed'=>'Re-type your password as 
password_confirmation, passwords does not match'
        ];

    }

Opmerking: De datanaam en de validatieregel worden gescheiden door een punt (.) vóór de berichtdata.

Aangepaste validatie

Om aangepaste validatie te maken, kun je een Validator facade gebruiken in plaats van validate. De validator instance bevat twee argumenten: de te valideren data en een array van validatieregels. Deze twee argumenten worden doorgegeven aan de methode ::make op de validator facade, die een nieuwe validator instance genereert.

use Illuminate\Http\Request; 

public function store (Request $request){
        $validator = Validator::make($request->all(),[
            'email' => 'required|unique:users|email',
            'age' => 'required|numeric',
            'password' => 'required|min:7|confirmed'
        ]);
        if ($validator->fails()) {
            // Return errors or redirect back with errors
            return $validator->errors();
        }
 
        // Retrieve the validated input...
        $validated = $validator->validated();
        // Continue logic to store the data

    }

Als je een automatische direct wilt toevoegen, kun je de methode validate uitvoeren op een reeds bestaande validatorinstantie. Als de validatie mislukt, produceert een XHR verzoek een JSON respons met 422 Unprocessable Entity als statuscode, of de gebruiker wordt onmiddellijk doorgestuurd.

$validator = Validator::make($request->all(),[
'email' => 'required|unique:users|email',
'password' => 'required|min:7|confirmed'
])->validate();

Je kunt je foutmeldingen ook aanpassen door een derde argument genaamd messages door te geven aan Validate::make method:

$validator = Validator::make($request->all(),[
            'email' => 'required|unique:users|email',
            'age' => 'required|numeric',
            'password' => 'required|min:7|confirmed'
        ], $messages = [
            'required' => 'The :attribute field is required.',
]);

Opmerking: De :attribute wordt vervangen door de naam van het te valideren veld.

Samenvatting

Datavalidatie is cruciaal om je dataset schoon, juist en volledig te houden. Met datavalidatie kun je fouten in je data elimineren die je project kunnen beschadigen of anderszins beïnvloeden. Validatie wordt steeds belangrijker als je op grote schaal en met grote hoeveelheden data werkt.

Laravel maakt tal van flexibele benaderingen mogelijk om de integriteit en nauwkeurigheid te waarborgen van de data die door je applicatie gaan. Je kunt ingewikkelde validatielogica realiseren met standaard en aanpasbare methoden, waardoor je codebase goed gestructureerd en gemakkelijker herbruikbaar wordt.

Ship je Laravel apps sneller met Kinsta’s Applicatie Hosting diensten.

Jeremy Holcombe Kinsta

Content & Marketing Editor bij Kinsta, WordPress Web Developer en Content Writer. Buiten alles wat met WordPress te maken heeft, geniet ik van het strand, golf en films. En verder heb ik last van alle problemen waar andere lange mensen ook tegenaan lopen ;).