
به تازگی که که برای پروژهای سراغ API نویسی با فریمورک Laravel رفته بودم، متوجه شدم برای فرستادن data به سمت action ها فرقی نمیکنه که data از query string فرستاده بشه یا از طریق request body. خب این شاید در ظاهر مشکل مهمی به نظر نیاد، اما اگر به خاطر سهلانگاری اطلاعات حساسی مثل username یا password از طریق query string ارسال بشن، ممکنه خیلی راحت لو برن و مشکلات جبران ناپذیری پیش بیاد. البته این خیلی عجیب بود که چنین چیزی به طور پیشفرض توسط خود فریمورک هندل نمیشه و توی document های رسمی هم به این موضوع اشاره ای نشده.
برای حل این مشکل جستجو های زیادی توی اینترنت انجام دادم و forum های مختلفی رو هم دیدم. شاید بگم تقریبا یک روز فقط دنبال این بودم که شاید شخصی به این مشکل خورده باشه و تونسته باشه برطرف کنه، اما چیز خاصی دستگیرم نشد :(
به خاطر همین سراغ این رفتم که ببینم کلاس FormRequest که کلاس هایی که برای validation با دستور php artisan make:request ایجاد میشن، از اون extend میشن چه توابعی توی خودش داره و در اصل چطور data رو از request دریافت و اون رو validate میکنه. تا این که به تابعی به نام input در ترِیت InteractsWithInput.php رسیدم که چنین ساختاری داره:

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

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

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

با این روش، تابع validate در همه کنترلرها هم درست کار میکنه :)
ممنون میشم سوالات و پیشنهاداتتون رو در رابطه با این پست مطرح کنید. موفق باشید.