Help me een aangepaste validatieregel maken in Laravel voor mijn formulier invoer
description
Door een aangepaste validatieregel te maken, kun je ervoor zorgen dat gebruikersinvoer wordt gevalideerd volgens jouw unieke vereisten, wat de algehele kwaliteit en betrouwbaarheid van je toepassing verbetert.
prompt
try_prompt
Ik wil een aangepaste validatieregel implementeren in mijn Laravel-toepassing die ervoor zorgt dat mijn formulier invoer voldoet aan specifieke criteria voor {{input_field}}. Leg uit hoe je deze validatieregel maakt, incl ... more
generate_helper
...
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Om een aangepaste validatieregel te maken in Laravel die controleert of het invoer e-mailadres voldoet aan specifieke criteria (bijvoorbeeld dat het precies "gebruiker@voorbeeld.com" moet zijn), kun je de volgende stappen volgen:
1. Maak een aangepaste validateregel door een nieuwe regelklasse te definiëren of door een inline validatie te gebruiken.
2. Voor deze uitleg gebruiken we een custom rule class via `php artisan make:rule`.
Stappen:
### Stap 1: Maak een custom rule aan
Voer in terminal uit:
```bash
php artisan make:rule SpecificEmail
```
### Stap 2: Implementatie van de regel
Open de gegenereerde class `app/Rules/SpecificEmail.php` en pas deze aan:
```php
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class SpecificEmail implements Rule
{
/**
* Controleer of de invoer voldoet aan het criterium.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return $value === 'gebruiker@voorbeeld.com';
}
/**
* Foutmelding tonen wanneer validatie mislukt.
*
* @return string
*/
public function message()
{
return 'Voer een geldig e-mailadres in.';
}
}
```
### Stap 3: Gebruik de regel in je validatie
In je controller of formulierverzoek, pas je de validatie toe:
```php
use App\Rules\SpecificEmail;
$request->validate([
'email' => ['required', 'email', new SpecificEmail],
]);
```
### Voorbeeld van foutmelding
Wanneer de gebruiker een ander e-mailadres invoert, wordt de volgende foutmelding getoond:
```
Voer een geldig e-mailadres in.
```
---
**Samenvatting:**
- Maak een nieuwe Rule-klasse aan.
- Implementeer de `passes`-methode om de specifieke criteria te controleren.
- Past de regel toe in je validatieregels.
- De foutmelding wordt weergegeven indien de validatie niet slaagt.
Zo zorg je voor een op maat gemaakte validatieregel die voldoet aan jouw criteria!
provider: deepseek
model: deepseek-chat
Hier is een uitgebreide uitleg voor het maken van een aangepaste validatieregel in Laravel voor het specifieke e-maildomein `gebruiker@voorbeeld.com`:
## Stap 1: Maak een aangepaste validatieregel
### Optie A: Via Rule-object (Aanbevolen)
```php
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class VoorbeeldEmailRule implements Rule
{
public function passes($attribute, $value)
{
// Controleer of het e-mailadres eindigt op @voorbeeld.com
return filter_var($value, FILTER_VALIDATE_EMAIL) &&
substr($value, -13) === '@voorbeeld.com';
}
public function message()
{
return 'Voer een geldig e-mailadres in.';
}
}
```
### Optie B: Via Validator::extend (in AppServiceProvider)
```php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Validator::extend('voorbeeld_email', function ($attribute, $value, $parameters, $validator) {
return filter_var($value, FILTER_VALIDATE_EMAIL) &&
substr($value, -13) === '@voorbeeld.com';
});
Validator::replacer('voorbeeld_email', function ($message, $attribute, $rule, $parameters) {
return 'Voer een geldig e-mailadres in.';
});
}
}
```
## Stap 2: Gebruik de validatieregel in je controller
```php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Rules\VoorbeeldEmailRule;
class UserController extends Controller
{
public function store(Request $request)
{
$validated = $request->validate([
'email' => ['required', 'email', new VoorbeeldEmailRule],
// Andere velden...
]);
// Verwerk de gevalideerde data
}
}
```
Of als je de extend-methode gebruikt:
```php
$validated = $request->validate([
'email' => ['required', 'email', 'voorbeeld_email'],
]);
```
## Stap 3: Alternatieve implementatie met regex
```php
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class VoorbeeldEmailRule implements Rule
{
public function passes($attribute, $value)
{
// Gebruik regex voor nauwkeurigere validatie
return preg_match('/^[a-zA-Z0-9._%+-]+@voorbeeld\.com$/', $value);
}
public function message()
{
return 'Voer een geldig e-mailadres in.';
}
}
```
## Stap 4: Form Request Validation (Alternatieve aanpak)
Maak een form request class:
```bash
php artisan make:request StoreUserRequest
```
```php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use App\Rules\VoorbeeldEmailRule;
class StoreUserRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'email' => ['required', 'email', new VoorbeeldEmailRule],
'naam' => 'required|string|max:255',
];
}
public function messages()
{
return [
'email.required' => 'E-mailadres is verplicht.',
'email.email' => 'Voer een geldig e-mailadres in.',
];
}
}
```
Gebruik in je controller:
```php
public function store(StoreUserRequest $request)
{
// Data is al gevalideerd
$validated = $request->validated();
}
```
## Foutmeldingen
Wanneer de validatie mislukt, worden deze foutmeldingen getoond:
- **Algemene e-mailvalidatie mislukt**: "Voer een geldig e-mailadres in."
- **Specifieke domeinvalidatie mislukt**: "Voer een geldig e-mailadres in." (zelfde bericht)
- **Verplicht veld leeg**: "Het e-mailadres veld is verplicht."
## Blade template voor foutweergave
```blade
<form method="POST" action="/users">
@csrf
<div class="form-group">
<label for="email">E-mailadres</label>
<input type="email" name="email" id="email" class="form-control" value="{{ old('email') }}">
@error('email')
<div class="text-danger">{{ $message }}</div>
@enderror
</div>
<button type="submit" class="btn btn-primary">Verzenden</button>
</form>
```
## Testvoorbeelden
**Geldige invoer:**
- `gebruiker@voorbeeld.com`
- `test.user@voorbeeld.com`
- `admin@voorbeeld.com`
**Ongeldige invoer:**
- `gebruiker@gmail.com` (verkeerd domein)
- `gebruiker@voorbeeld` (onvolledig domein)
- `@voorbeeld.com` (geen gebruikersnaam)
Deze implementatie zorgt ervoor dat alleen e-mailadressen met het domein `@voorbeeld.com` worden geaccepteerd en geeft de opgegeven foutmelding weer wanneer de validatie mislukt.

