Nu er det mere end nogensinde før afgørende, at dataene i dine applikationer er gyldige, nøjagtige og opfylder alle systemkrav. Det er nødvendigt at opretholde datakonsistens og undgå sikkerhedssårbarheder.

Laravel gør datavalidering let og intuitiv. Det følger en model view controller-arkitektur (MVC) og kræver kun generel viden om PHP og objektorienterede programmeringsbegreber (OOP). Desuden tilbyder Laravel flere metoder til validering af indgående data.

Udforsk nogle af disse metoder, og hvordan du anvender valideringsregler på dit datasæt.

Datavalidering gjort let i Laravel

Laravel indeholder flere færdige valideringsregler til brug, når brugerne af din applikation indsender data via formularer. Du kan markere inputfelter som obligatoriske, angive en minimums- eller maksimumslængde og kræve unikke (ikke-duplikerede) indtastninger og gyldige e-mailadresser. Laravel-valideringsværktøjet kontrollerer, om input opfylder disse regler eller andre regler, du angiver.

Disse Laravel-valideringsregler omfatter:

  • required – Feltdataene må ikke være nul eller tomme.
  • array – Feltdataene skal være et PHP-array.
  • bail – Valideringsreglen stopper med at blive udført, når den støder på den første fejl ved valideringen.
  • email – Feltdataene skal være en gyldig e-mailadresse.
  • unique – Feltdataene må ikke have dubletter i databasetabellen.

Alle valideringsmetoder har fordele og ulemper, men deres forskellige muligheder gør det muligt for dig at vælge den bedste metode til dine behov. Afhængigt af den valgte metode kan Laravel-validering forekomme på flere måder, med manuelle eller automatiske fejlmeddelelser.

Den mest almindelige metode er code>validate, der bruges til indgående HTTP-forespørgsler. Denne metode er kædet til anmodningsdataene og udfører valideringsreglerne. Du kan adskille reglerne for hvert felt med kommaer, som det ses i eksemplet nedenfor.

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

}

Her er email et obligatorisk input, hvilket betyder, at det ikke kan være nul. Desuden skal det være unikt i databasetabellen users, hvilket sikrer, at den samme e-mailadresse ikke registreres to gange. Den sidste regel foreskriver, at e-mail-adressen også skal være gyldig. Ellers ophører valideringsprocessen. Navnefeltet er påkrævet, men har ingen andre regler.

Hvis en Laravel-valideringsregel fejler, genereres der automatisk et svar.

Grundlæggende om validering

For bedre at forstå valideringsmetoderne kan du se på følgende eksempel. Du definerer en rute for slutpunktet og opretter en controller til at validere og behandle anmodningsdataene.

Først skal du oprette et simpelt endpoint, der giver brugerne mulighed for at gemme deres e-mail og passwords.

Definer ruten

Laravel-ruter defineres i filen routes/web.php for en webapplikation eller routes/api.php for en API. I dette eksempel skal du bruge api.php:

use AppHttpControllersUserController;
 
Route::post('/store', [UserController::class]);

Opret controlleren

Kør denne Artisan-kommando for at oprette controlleren:

php artisan make:controller

UserController

Denne kommando opretter en UserController.php-fil i mappen app/Http/Controllers.

Definer nu en store -metode til at validere data, der kommer ind i butiks-endpointed før de gemmes.

Dette eksempel vil validere følgende felter ved hjælp af disse regler:

  • email – Skal være unik, en gyldig e-mail og skal være påkrævet
  • password – Skal have en minimumslængde, passwordbekræftelse og skal være påkrævet
  • age – Skal være et tal og skal være påkrævet
<?php

namespace AppHttpControllers;
use IlluminateHttpRequest;
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
    }

}

Med reglen confirmed kan du kræve et bestemt felt to gange for at kontrollere, at dataene er korrekte, f.eks. når brugere indtaster deres passwords igen under registreringen. Denne regel kræver et felt kaldet password_confirmation, hvis data skal stemme overens med passwordfeltet.

Vis fejlmeddelelser

Hvis valideringskriterierne er opfyldt, fortsætter din kode med at køre normalt. Hvis valideringen mislykkes, udløses en IlluminateValidationValidationException -undtagelse, og det relevante fejlsvar returneres.

Eksemplet er baseret på et API, som returnerer et 422 Unprocessable Entity HTTP-svar i JSON-format. For webapplikationer ville det omdirigere til den tidligere URL for at vise fejlmeddelelsen, og anmodningsdataene ville blive flashet til sessionen.

Du kan bruge variablen $errors i dine visninger til at vise returnerede fejl:

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

Du kan også vælge kun at få vist den første fejl eller at gennemløbe en loop for at få vist dem alle.

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

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

Genopfyldning af formularer

Ved at genopfylde formularer slipper brugerne for at indtaste oplysninger igen, så de kan fokusere på at rette fejlen. I eksemplet med en e-mailadresse, der ikke blev udfyldt, kan du genopfylde resten af formularen ved at kalde den gamle værdi for name -feltet.

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

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

Denne regel ville returnere null, hvis der ikke var noget tidligere input.

Avanceret validering

Laravel tilbyder en anden metode til at skrive valideringer kaldet formularforespørgsler. En formularanmodning er en brugerdefineret anmodningsklasse, der organiserer valideringer og afvikler din controller.

De har deres egen validerings- og autorisationslogik, der er egnet til store inputmængder, og kan bruges til at definere valideringsregler og tilpasse fejlmeddelelser.

For at oprette en formularanmodning skal du køre denne Artisan-kommando:

php artisan make:request StoreUserRequest

Denne kommando opretter en StoreUserRequest.php-fil i mappen app/Http/Requests og indeholder to standardmetoder:

  • rules returnerer valideringsregler for anmodningsdata.
  • authorize returnerer en boolean, der angiver, om brugeren har tilladelse til at udføre den ønskede handling.

Konverter det foregående eksempel til at bruge en formularanmodning.

<?php

namespace AppHttpRequests;
use IlluminateFoundationHttpFormRequest;
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'
        ];
    }

}

Hvis du vil tilpasse fejlmeddelelserne for disse regler, kan du tilsidesætte messages-metoden i klassen FormRequest.

/**

     * 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'
        ];

    }

Bemærk: Datanavnet og valideringsreglen er adskilt af et punktum (.) før meddelelsesdataene.

Brugerdefineret validering

Hvis du vil oprette brugerdefineret validering, kan du bruge en Validator -facade i stedet for validate. Validatorinstansen indeholder to argumenter: de data, der skal valideres, og et array af valideringsregler. Disse to argumenter overføres til metoden ::make på validatorfacaden, hvorved der genereres en ny validatorinstans.

use IlluminateHttpRequest; 

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

    }

Hvis du ønsker at tilføje en automatisk direkte, kan du udføre metoden validate på en allerede eksisterende validatorinstans. Hvis valideringen mislykkes, producerer en XHR-forespørgsel et JSON-svar med 422 Unprocessable Entity som statuskode, eller brugeren omdirigeres straks.

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

Du kan også tilpasse dine fejlmeddelelser ved at sende et tredje argument kaldet messages til 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.',
]);

Bemærk: :attribute erstattes med navnet på det felt, der skal valideres.

Opsummering

Datavalidering er afgørende for at holde dit datasæt rent, korrekt og fuldstændigt. Datavalidering giver dig mulighed for at fjerne fejl i dine data, som potentielt kan ødelægge eller på anden måde påvirke dit projekt. Validering bliver stadig vigtigere, når man arbejder i stor skala og med store datamængder.

Laravel giver mulighed for mange fleksible tilgange til at sikre integriteten og nøjagtigheden af de data, der passerer gennem din applikation. Du kan opnå kompliceret valideringslogik med standardmetoder og metoder, der kan tilpasses, hvilket gør din kodebase velstruktureret og lettere genanvendelig.

Send dine Laravel-apps hurtigere med Kinsta’s applikationshosting-tjenester.

Jeremy Holcombe Kinsta

Content & Marketing Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems ;).