HTTP Requests
شئ request بنا به هر درخواست (به ازای هر درخواست) ایجاد میشه که شامل اطلاعات درخواست کاربر نظیر پارامتر هاش اگر ارسال کرده باشه (مثلا در فرم ها) میشه و همچنین از طریق اون می شه به برخی Middleware ها نیز دسترسی پیدا کرد.
هر زمان صحبت از درخواست (Routing) میشه معمولا به ازای هر درخواست شئ request هم وجود داره. حال این که این شئ از چه کلاسی instantiate شده باشه تصمیم با شماست.
در ادامه با دو روش Illuminate Request و Custom Request آشنا میشیم :
Illuminate Request
همون طور که می دونید در چرخه Request تا Response ما از controller به عنوان مرکز اصلی پردازش در برنامه خودمون یاد کردیم. برای اینکه از امکانات لاراول در controller استفاده کنیم باید اون رو import کنیم که در اصطلاح به این روال dependency injection می گوییم.
به طور مثال برای استفاده از شئ Request ساخته شده در طول چرخه Request تا Response ما باید Illuminate\Http\Request
رو import کنیم که پس از این کار به صورت اتوماتیک توسط service container شئ Request تزریق میشه.
request متد های مختلفی داره که ما در controller از اون ها استفاده می کنیم. متدهای موجود در request بر محوریت داده های موجود در درخواست کاربر می باشد.
دریافت پارامتر های کاربر
پارامتر هایی که کاربر با استفاده از Http Verb های POST , GET میفرسته با استفاده از متدهای زیر قابل دستیابی هستند:
$request->all()
: تمامی پارامتر های ارسالی از سمت کاربر را می گیرد.$request->except([])
: یک پارامتر ورودی می گیرد و تمامی پارامتر هایی که کاربر ارسال کرده جز مورد ورودی خودش را بر می گرداند.$request->only([])
: برعکس متدexcept
تنها مقدار پارامترهایی که در قالب ورودی گرفته را برمی گرداند.$request->input(NAME, DEFAULT_VALUE)
: مقدار پارامتر با نام NAME رو بر میگردونه و اگر مقدار برابر null باشه مقدار پیش فرض DEFAULT_VALUE رو بر می گردونه.- Dynamic Properties : یعنی مقدار پارامتری با نام name رو به عنوان property از شئ request میدونه. مثلا
$request->name
که فارغ از این که با چه متدی (Http Verb) پارامتر ارسال شده مقدار اون رو بر میگردونه.
نکته : همان طور که در موارد بالا می بینید request یک شئ instance شده است و متد های آن به همین روش (با علامت →) فراخوانی می شوند.
به طور مثال اگر در route بر اساس متد Post پارامتر هایی توسط کاربر بوسیله فرم ارسال شده باشه :
<?php Route::post('/new-product', 'productController@create');
در متد create از کنترولر productController ما تمامی پارامتر های دریافت شده رو چاپ می کنیم:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller { public function update(Request $request) { $params = $request->all(); dd($params); } }
خروجی کد بالا به ازای داده name به شکل زیر خواهد بود :
array:5 [ "_token" => "UpfvrICYCYj4UELLdHV3R5IPWR0L0c0gyroTlqJe" "name" => "Pelikano 2014" ]
کاربرد دیگر شئ request اعتبار سنجی فیلد های کاربر است که با استفاده از قوانین اعتبار سنجی لاراول (validation rules) قابل انجام است.
public function store(Request $request) { $validatedData = $request->validate([ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ]); // The blog post is valid... }
مثلا در متد بالا که متدی از کلاس controller هست ما بوسیله شئ request فیلد های title , name رو اعتبار سنجی کردیم. که در صورت معتبر بودن ادامه کد ها اجرا میشه و در غیر این صورت $errors->all()
به مکان جاری داده میشه و ادامه کدها اجرا نمیشه.
Custom Request
در این روش می تونید یک کلاس از روی کلاس Request بسازید (extend) و متد هاش رو با توجه به نیاز خودتون باز نویسی کنید. Request هم مثل یک ابزار . برای ساخت یک Request جدید از قطعه کد زیر استفاده کنید :
php artisan make:request REQUESTNAME
مثلا ما برای Application خودمون یک request با نام storeProduct ساخته ایم . فایلی در پوشه به آدرس app/Http/Requests/storeProduct.php
ساخته می شود که در اون کلاس که از FormRequest فرزند گرفته شده قرار داره.
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class storeProduct extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'name' => 'required|unique:products', ]; } public function checkImpoliteExp($validator) { $data = $validator->getData(); extract($data); if(strpos($name,"$") !== false) return true; else return false; } public function withValidator($validator) { $validator->after(function ($validator) { if ($this->checkImpoliteExp($validator)) { $validator->errors()->add('field', 'dollar sign is illegal character'); } }); } /** * Get custom messages for validator errors. * * @return array */ public function messages() { return [ 'name.required' => 'please fill name field', ]; } }
شرح متد های کلاس storeProduct :
- authorize : این متد اعتبار سنجی انجام میده که اگر مقدار true داشته باشه معتبر و در غیر اینصورت نامعتبر می شه request (قوانین مربوط به authorization)
-
rules : قوانین فیلتر داده های ورودی. (validation rules)
-
messages : پیام هایی که به ازای هر rule برای کاربر در
$errors->all()
قرار می گیرد را می توان اینجا نوشت.
در پایان این کلاس باید در controller فراخونده بشه و ما با استفاده از متد validate اعتبار سنجی request رو انجام بدیم که در صورت معتبر بودن متد های بالا ادامه کد امکان پذیر خواهد بود.
نکته : کلاس storeProduct از کلاس FormRequest گرفته شده . یعنی کلیه متد هایی که در Illuminate Request توضیح داده شد در قسمت custome request هم قابل پیاده سازی است.
دیدگاهتان را بنویسید