Validatie

Er zijn twee vormen van validatie:

Client side validatie

Let op deze validatie heeft twee grote nadelen:

Kwetsbaarheid voor manipulatie: Client-side validatie vindt plaats op de computer van de gebruiker, wat betekent dat kwaadwillende gebruikers de validatieregels gemakkelijk kunnen omzeilen of uitschakelen door de client-side code aan te passen of uit te schakelen. Dit maakt het onbetrouwbaar voor het beveiligen van gevoelige gegevens of kritieke processen.

Browserafhankelijkheid: Client-side validatie kan verschillen tussen browsers.

Maar deze validatie is zeer eenvoudig toe te passen dus wel wenselijk om als extra beveiliging te gebruiken.

Hieronder een paar voorbeelden hoe te gebruiken

<input type="text" name="title" placeholder="Titel" required>
Door de required entity toe te voegen aan een form field maak je veld verplicht de browser zal een melding geven wanneer de gebruiker het veld leeg laat. (let op dit gebeurt niet met hele oude browsers)
<input type="email" name="email" placeholder="email" required>
Door het type in een input veld mee te geven wordt ook een validatie gedaan. In bovenstaand voorbeeld kunnen alleen geldige email adressen worden ingevoerd.
 
Door middel van DevTools is de bron van de pagina aan te passen en kunnen eenvoudig de client validaties worden verwijderd. Client validatie is handig, maar niet voldoende.
 
Daarnaast zijn nog een aantal Javascript validaties mogelijk. Maar die gaan te ver voor deze cursus.

Server side validatie

Bij server side validatie ga je valideren op het moment dat het formulier naar de server is verstuurd.
We zullen een voorbeeld uitwerken voor het opslaan van een nieuwe 'post'. Dit opslaan gebeurt in de controller post-store.php. Deze gaan we hieronder aanpassen voor validatie
We kunnen hiervoor ons $request object gebruiken. Deze is altijd beschikbaar en bevat een validate methode. Deze methode wil een array als input met als key het verstuurde veld en als value de validatie regel die toegepast moet worden.
Onderstaande hebben we daarvoor al eens gebruikt.
$request->validate([
    'title' => 'required',
    'content' => 'required'
]);

Indien de validatie mislukt zal de gebruiker terug worden gestuurd naar de pagina waar hij/zij vandaan kwam. Op de pagina is dan de methode errors() beschikbaar om de eventueel validatie fouten te tonen.

Stel in ons voorbeeld van post-store.php dat content leeg zou zijn. Dan worden we teruggestuurd naar de pagina post-create.Op deze pagina willen we graag de foutmelding tonen. Bijvoorbeeld in het rood onder het input veld.

<textarea name="content" placeholder="Content..." class="border-1 rounded-md py-1 px-2"></textarea>
<?php if (errors('content')): ?>
    <p class="text-red-500 text-sm my-2"><?= errors('content') ?></p>
<?php endif; ?>
<br>

Indien er een error op het veld content is dan zal in het rood de error boodschap verschijnen.

Uiteraard kunnen we hetzelfde toevoegen bij het veld title.
Je ziet dat het veld title wat misschien wel al gevuld was leeg terugkomt na een validatie fout. Dit is niet wenselijk. De gebruiker moet dan door één foutje alles opnieuw invoeren. Om dit te voorkomen kan de helper functie old() gebruikt worden. Dit geeft de waarde weer die was ingevuld voor het versturen.

<form action="/posts-store" method="post">
    <?= csrf() ?>
    <input type="text" name="title" placeholder="Titel" value="<?= old('title') ?>" class="border-1 rounded-md py-1 px-2" required>
    <?php if (errors('title')): ?>
        <p class="text-red-500 text-sm my-2"><?= errors('title') ?></p>
    <?php endif; ?>
    <br>
    <textarea name="content" placeholder="Content..." class="border-1 rounded-md py-1 px-2"><?= old('content') ?></textarea>
    <?php if (errors('content')): ?>
        <p class="text-red-500 text-sm my-2"><?= errors('content') ?></p>
    <?php endif; ?>
    <br>
    <input type="submit" value="Opslaan" class="border-1 rounded-md px-2 py-1 hover:bg-gray-100 cursor-pointer">
</form>

 

 

Opgave K1.1 - errors en old toevoegen

Voeg de error teksten toe (als er een error is) aan de view post-edit.view.php en aan de post-create.view.php. Zoals in het voorbeeld hierboven.

Gebruik de functie old( ) om de verstuurde waarde te tonen. Gebruik hierbij twee parameters. Als eerste de meegestuurde waarde, en als tweede de waarde uit de database, bv:

old('content', $post['content'])

 

Uitwerking

/app/views/posts-edit.view.php

/app/views/posts-create.view.php