Walidacja danych w Laravel: wygodna i wydajna
Opublikowany: 2023-05-03Teraz bardziej niż kiedykolwiek ważne jest, aby dane w aplikacjach były prawidłowe, dokładne i spełniały wszystkie wymagania systemowe. Odpowiada na potrzebę zachowania spójności danych i unikania luk w zabezpieczeniach.
Laravel sprawia, że walidacja danych jest łatwa i intuicyjna. Jest zgodny z architekturą kontrolera widoku modelu (MVC) i wymaga jedynie ogólnej znajomości PHP i koncepcji programowania obiektowego (OOP). Ponadto Laravel oferuje kilka metod walidacji przychodzących danych.
Zapoznaj się z niektórymi z tych podejść i dowiedz się, jak zastosować reguły sprawdzania poprawności do swojego zestawu danych.
Łatwa walidacja danych w Laravel
Laravel zapewnia kilka gotowych do użycia reguł sprawdzania poprawności, kiedy użytkownicy Twojej aplikacji przesyłają dane za pośrednictwem formularzy. Możesz oznaczyć pola wejściowe zgodnie z wymaganiami, ustawić minimalną lub maksymalną długość oraz wymagać unikalnych (nieduplikatów) wpisów i prawidłowych adresów e-mail. Walidator Laravel sprawdza, czy dane wejściowe spełniają te lub inne określone przez Ciebie reguły.
Te zasady sprawdzania poprawności Laravel obejmują:
-
required
— Dane pola nie mogą być puste ani puste. -
array
— Dane pola muszą być tablicą PHP. -
bail
— Reguła sprawdzania poprawności przestaje działać po napotkaniu pierwszego niepowodzenia sprawdzania poprawności. -
email
— dane w polu muszą być poprawnym adresem e-mail. -
unique
— Dane pola nie mogą mieć duplikatów w tabeli bazy danych.
Wszystkie metody walidacji mają wady i zalety, ale ich różnorodność pozwala wybrać podejście najlepsze dla Twoich potrzeb. W zależności od wybranej metody walidacja Laravel może odbywać się na kilka sposobów, z ręcznymi lub automatycznymi komunikatami o błędach.
Najpopularniejszą metodą jest code>validate, używana do przychodzących żądań HTTP. Ta metoda jest powiązana z danymi żądania, wykonując reguły sprawdzania poprawności. Możesz oddzielić reguły dla każdego pola przecinkami, jak pokazano w poniższym przykładzie.
use Illuminate\Http\Request; public function store (Request $request){ $validated = $request->validate([ 'email' => ['required, unique:users, email, bail'], 'name' => ['required'], ]); }
W tym przypadku email
jest wymaganym wejściem, co oznacza, że nie może mieć wartości null. Dodatkowo musi być unikalny w tabeli bazy danych users
, co gwarantuje, że ten sam adres e-mail nie zostanie zarejestrowany dwukrotnie. Ostatnia zasada mówi, że adres e-mail musi być również ważny. W przeciwnym razie proces walidacji zostaje przerwany. Pole nazwy jest wymagane, ale nie ma żadnych innych reguł.
Jeśli jakakolwiek reguła sprawdzania poprawności Laravel zawiedzie, odpowiedź jest generowana automatycznie.
Podstawy walidacji
Aby lepiej zrozumieć metody sprawdzania poprawności, rozważ poniższy przykład. Zdefiniujesz trasę dla punktu końcowego i utworzysz kontroler do sprawdzania poprawności i przetwarzania danych żądania.
Najpierw utwórz prosty punkt końcowy, który pozwoli użytkownikom przechowywać ich e-maile i hasła.
Zdefiniuj trasę
Trasy Laravel są zdefiniowane w pliku tras/web.php dla aplikacji internetowej lub tras/api.php dla interfejsu API. W tym przykładzie użyj api.php :
use App\Http\Controllers\UserController; Route::post('/store', [UserController::class]);
Utwórz kontroler
Uruchom to polecenie Artisan, aby utworzyć kontroler:
php artisan make:controller UserController
To polecenie tworzy plik UserController.php w katalogu app/Http/Controllers .
Teraz zdefiniuj metodę store
, aby sprawdzić poprawność danych wprowadzanych do punktu końcowego sklepu przed ich zapisaniem.
Ten przykład sprawdzi poprawność następujących pól przy użyciu tych reguł:
- e-mail — powinien być unikalny, prawidłowy adres e-mail i musi być wymagany
- hasło — powinno mieć minimalną długość, potwierdzenie hasła i musi być wymagane
- wiek — musi być liczbą i musi być wymagany
<?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 } }
confirmed
reguła umożliwia dwukrotne wymaganie określonego pola w celu sprawdzenia poprawności danych, na przykład użytkownicy ponownie wprowadzają swoje hasła podczas rejestracji. Ta reguła wymaga pola o nazwie password_confirmation
, którego dane muszą pasować do pola hasła .
Wyświetl komunikaty o błędach
Jeśli kryteria weryfikacji zostaną spełnione, Twój kod będzie działał normalnie. Jeśli sprawdzanie poprawności nie powiedzie się, zostanie zgłoszony wyjątek IlluminateValidationValidationException
i zwrócona zostanie odpowiednia odpowiedź na błąd.
Przykład jest oparty na interfejsie API, który zwraca odpowiedź HTTP 422 Unprocessable Entity
w formacie JSON. W przypadku aplikacji internetowych przekierowuje do poprzedniego adresu URL, aby wyświetlić komunikat o błędzie, a dane żądania są przesyłane do sesji.
Możesz użyć zmiennej $errors
w swoich widokach, aby wyświetlić zwrócone błędy:
@if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
Możesz także wyświetlić tylko pierwszy błąd lub przejść przez pętlę, aby wyświetlić je wszystkie.
// Fetch all errors $errors->all() // Fetch only the first error $errors->first()
Ponownie wypełnij formularze
Ponowne wypełnianie formularzy oszczędza użytkownikom ponownego wpisywania informacji, dzięki czemu mogą skupić się na naprawianiu błędu. W przykładzie adresu e-mail, który się nie powiedzie, możesz ponownie wypełnić resztę formularza, wywołując starą wartość pola name
.
$name = $request-> old('name') //Blade helper <input type="text" name="name" value="{{ old('name') }}">
Ta reguła zwróci null
, jeśli nie było żadnych wcześniejszych danych wejściowych.
Zaawansowana walidacja
Laravel zapewnia inną metodę pisania walidacji zwaną żądaniami formularzy. Żądanie formularza to niestandardowa klasa żądania, która organizuje walidacje i odciąża kontroler.
Posiadają własną logikę sprawdzania poprawności i autoryzacji odpowiednią dla dużych ilości danych wejściowych i mogą być używane do definiowania reguł sprawdzania poprawności i dostosowywania komunikatów o błędach.
Aby utworzyć żądanie formularza, uruchom to polecenie Artisan:
php artisan make:request StoreUserRequest
To polecenie tworzy plik StoreUserRequest.php w katalogu app/Http/Requests i zawiera dwie domyślne metody:
-
rules
zwraca reguły sprawdzania poprawności danych żądania. -
authorize
zwraca wartość logiczną określającą, czy dany użytkownik ma uprawnienia do wykonania żądanej akcji.
Przekonwertuj poprzedni przykład, aby użyć żądania formularza.
<?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' ]; } }
Aby dostosować komunikaty o błędach w tych regułach, można zastąpić metodę komunikatów w klasie 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' ]; }
Uwaga: Nazwa danych i reguła sprawdzania poprawności są oddzielone kropką (.) przed danymi komunikatu.
Walidacja niestandardowa
Aby utworzyć niestandardową walidację, możesz użyć fasady Validator
zamiast validate
. Instancja walidatora zawiera dwa argumenty: dane do walidacji oraz tablicę reguł walidacji. Te dwa argumenty są przekazywane do metody ::make
na fasadzie walidatora, generując nową instancję walidatora.
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 }
Jeśli chcesz dodać automatyczne polecenie bezpośrednie, możesz wykonać metodę validate
na istniejącej już instancji walidatora. Jeśli sprawdzanie poprawności nie powiedzie się, żądanie XHR generuje odpowiedź JSON z kodem stanu 422 Unprocessable Entity
lub użytkownik zostanie natychmiast przekierowany.
$validator = Validator::make($request->all(),[ 'email' => 'required|unique:users|email', 'password' => 'required|min:7|confirmed' ])->validate();
Możesz także dostosować komunikaty o błędach, przekazując trzeci argument o nazwie messages
do 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.', ]);
Uwaga: :attribute
jest zastępowane nazwą pola podlegającego walidacji.
Streszczenie
Przeprowadzanie sprawdzania poprawności danych ma kluczowe znaczenie dla utrzymania czystego, poprawnego i kompletnego zbioru danych. Walidacja danych pozwala wyeliminować błędy w danych, które mogłyby potencjalnie uszkodzić lub w inny sposób wpłynąć na projekt. Walidacja staje się coraz ważniejsza podczas pracy na dużą skalę iz dużą ilością danych.
Laravel umożliwia wiele elastycznych podejść w celu zapewnienia integralności i dokładności danych przechodzących przez aplikację. Możesz osiągnąć skomplikowaną logikę walidacji za pomocą domyślnych i dostosowywalnych metod, dzięki czemu baza kodu ma dobrą strukturę i jest łatwiejsza do ponownego użycia.
Szybciej wysyłaj swoje aplikacje Laravel dzięki usługom hostingu aplikacji Kinsta.