• Час читання ~4 хв
  • 08.09.2023

Сьогоднішній пост знов трохи про очевидну річ, про валідацію даних. Для чого потрібна валідація, як нею користуватись, про кастомні правила та навіщо використовувати Form Request для валідації.

Якщо говорити про проекти, які траплялись мені на фрілансі, дуже часто отримання даних від користвувача виглядало так:

Яка з цього може витікати проблема? При такому отриманні даних від користувача розробник відкриває можливість здійснити два види атак на свій додаток:

  1. XSS (Cross-Site Scripting — «міжсайтовий скриптинг») — досить поширена вразливість, яку можна виявити в багатьох веб-додатках. Її суть досить проста, зловмиснику вдається впровадити на сторінку JavaScript-код, який не було передбачено розробниками.
  2. SQL-ін'єкція (SQL-injection) - це вразливість веб-безпеки, яка дозволяє зловмиснику втручатися в запити, які додаток робить до своєї бази даних. Як правило, це дозволяє переглядати дані, які він зазвичай не може отримати. Це можуть бути інші користувачі, або будь-які інші дані, доступ до яких має сам додаток. У багатьох випадках зловмисник може змінювати або видаляти ці дані, викликаючи постійні зміни у вмісті або поведінці програми.

Отже в першу чергу валідація направлена на забезпечення безпеки даних в додатку, а по-друге валідація гарантує правильність даних, що вводяться користувачем, та допомагає уникнути некоректних даних в базі даних.

Є декілька способів валідації даних в Laravel:

  1. Використання методу validate який реалізований в трейті ValidatesRequests. За замовчуванням усі контролери, які розширюють базовий контролер наслідують цей трейт. Сам метод validate  приймає в себе об'єкт класу Illuminate\Http\Request, масив правил для валідації полів, масив з кастомними меседжами для виводу помилок, та масив з кастомними атрибутами останні два не є обов'язковими. Тому виконати валідацію даних можливо одразу в контролері, засобами самого контролела і виглядає це так:

2. Також можливо використати метод validate самого класу Illuminate\Http\Request, він приймає в себе майже тіж самі данні як і в попередньому приклдаі, за винятком об'єкту класу $request.

3. Ще один спосіб валідації - це створення валідатора вручну з використанням фасаду Illuminate\Validation\Validator та його методу make. Перший аргумент, який передається в метод make, отримує дані для перевірки. Другим аргументом є правила перевірки, які повинні застосовуватися до даних.

4. На мою думку, саме цей спосіб є найбільш правильним з архітектурної точки зору. Використання валідації через окремий клас, який імплементує Form Request, дозволяє вирішити один з головних принципів SOLID - принцип єдиного обов'язку (Single Responsibility Principle). Laravel вже має реалізовану команду для створення класу Form Request:

php artisan make:request NewValidationRequest

Ця команда створить наступний клас у app/Http/Requests, за замовчуванням клас створюється з двома методами authorize та rules. Метод authorize дозволяє реалізувати логіку перевірки чи користувач має необхідні дозволи для виконання запиту. Якщо authorize поверне true, запит буде продовжено до методу rules для валідації. Якщо authorize поверне false, користувач буде перенаправлений на сторінку з помилкою або оброблений за вказаною кастомною логікою. Метод rules зберігає та повертає масив правил, за якими будуть перевірятись вхідні дані. Цей клас можна розширити реалізувавши методи messages та attributes, які в свою чергу будуть повертати користувацікі повідомлення при помилках виконання валідації, та кастомні назви для атрібутів.

Отримати чисті дані в контролері, при використанні класу Form Request можливо так само, як при використанні звичайного валідатора класу Request:

Не буду копіпастити, та перераховувати всі доступні правила для валідації. В офіційній документації описані всі можливі правила https://laravel.com/docs/10.x/validation#available-validation-rules, але якщо цих правил недостатньо для покриття перевірками всіх ваших полів, у Laravel є механізм створення власних користувацьких правил валідації.

Цей механізм дозволяє створювати свої власні правила валідації, які відповідають специфічним потребам вашого додатка. Для створення нового правила вкиористовується команда:

php artisan make:rule CustomValidationRule

Вона створює нове правило в папці app/Rules, а сам клас реалізує лише 2 методи passes в якому повинна знаходитись логіка за якою буде перевірятись поле та message яке зберігає в собі повідомлення при не валідності даних.

Для того, щоб використати це правило при валідації достатньо додати його до масиву правил:

Для отримання та обробки помилок також є декілька способів в залежності від варіанту яким дані валідуються. Якщо потрібно отримати помилки при використанні класу Validator то всі помилки можна отримати звернувшись до методу errors:

А якщо для валідації використовувався об'єкт класу Request то отримати помилки можна з сесії:

У випадку коли потрібно обробити помилки у blade файлах там вкиористовується глобальна змінна $errors яка автоматично стає доступною для всіх макетів, а також є екземпляром класу MessageBag.

Приклад виводу всіх помилок в циклі

Або якщо потрібно вивести якусь конкретну помилку наприклад для одного поля використовується директива-хелпер @error

Приклад виводу однієї вибранох помилки

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297