ویرگول
ورودثبت نام
Mehran Nikoobayan
Mehran Nikoobayanعلاقه‌مند به laravel, بک اند دولوپر
Mehran Nikoobayan
Mehran Nikoobayan
خواندن ۳ دقیقه·۶ سال پیش

اصلاح data validation در فریم‌ورک Laravel

مشکل چیست؟

به تازگی که که برای پروژه‌ای سراغ API نویسی با فریم‌ورک Laravel رفته بودم، متوجه شدم برای فرستادن data به سمت action ها فرقی نمی‌کنه که data از query string فرستاده بشه یا از طریق request body. خب این شاید در ظاهر مشکل مهمی به نظر نیاد، اما اگر به خاطر سهل‌انگاری اطلاعات حساسی مثل username یا password از طریق query string ارسال بشن، ممکنه خیلی راحت لو برن و مشکلات جبران ناپذیری پیش بیاد. البته این خیلی عجیب بود که چنین چیزی به طور پیشفرض توسط خود فریم‌ورک هندل نمیشه و توی document های رسمی هم به این موضوع اشاره ای نشده.

راه حل

برای حل این مشکل جستجو های زیادی توی اینترنت انجام دادم و forum های مختلفی رو هم دیدم. شاید بگم تقریبا یک روز فقط دنبال این بودم که شاید شخصی به این مشکل خورده باشه و تونسته باشه برطرف کنه، اما چیز خاصی دستگیرم نشد :(

قسمت اول: کلاس های Form Request

به خاطر همین سراغ این رفتم که ببینم کلاس FormRequest که کلاس هایی که برای validation با دستور php artisan make:request ایجاد میشن، از اون extend میشن چه توابعی توی خودش داره و در اصل چطور data رو از request دریافت و اون رو validate میکنه. تا این که به تابعی به نام input در ترِیت InteractsWithInput.php رسیدم که چنین ساختاری داره:

تابع input
تابع input

همونطور که مشخصه data ای که قراره validate بشه از مجموع request body و query string ها تشکیل میشه و به خاطر همین این مشکل پیش میاد. من برای رفع این مشکل یک کلاس ApiRequest ایجاد کردم و تمام کلاس های مربوط به validation رو از اون extend کردم و توی اون کلاس متد input رو به صورت زیر overwrite کردم:

کلاس ApiRequest
کلاس ApiRequest

به این صورت data ای که قراره validate بشه فقط از طریق request body دریافت میشه.

قسمت دوم: تابع validate در کنترلرها

گاهی اوقات هم پیش میاد که برای برخی از action ها از تابع validate خود کنترلر استفاده میکردم. که این تابع در ترِیت ValidateRequests.php وجود داره. همونطوری که در تصویر زیر مشخصه این تابع هم متد all که مجموعی از query string و request body رو برمی‌گردونه validate میکنه.

تابع validate در ترِیت ValidateRequests.php
تابع validate در ترِیت ValidateRequests.php

برای اصلاح این تابع هم کافیه که به جای تابع all ، از تابع post شیء request استفاده کنیم و این تابع رو به صورت زیر در کلاس کنترلر که در App/Http/Controllers قرار داره، بازنویسی کنیم:

تابع validate بازنویسی شده در کلاس کنترلر
تابع validate بازنویسی شده در کلاس کنترلر

با این روش، تابع validate در همه کنترلرها هم درست کار میکنه :)

ممنون میشم سوالات و پیشنهادات‌تون رو در رابطه با این پست مطرح کنید. موفق باشید.


laravelapiphp
۷
۶
Mehran Nikoobayan
Mehran Nikoobayan
علاقه‌مند به laravel, بک اند دولوپر
شاید از این پست‌ها خوشتان بیاید