تعداد بازدید: 894

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 هم قابل پیاده سازی است.

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای HTTP Requests

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *