اصلاح مقادیر قبل از اعتبار سنجی در لاراول

۱۷ بهمن ۱۳۹۷

در فریم ورک لاراول هنگام استفاده از form request class ها قبل از اعتبار سنجی داده می توانید داده های خود را دستکاری کنید و آنها را بهینه سازی کنید.برای مثال:

  • داده ها را به فرمتهای دلخواه خود در آورید مثلا لیستی که با کاما جدا شده اند را به یک آرایه تبدیل کنید.
  • یک مقدار را به مقدار دیگر تبدیل کنید، مثلا رشته را به عدد صحیح تبدیل کنید.
  • رفع اشتباه انتخاب نوع داده
  • داده های مخرب را از ورودی حذف کنید.

برای مثال فرض کنید می خواهیم برای ذخیره داده های پست خود از form request زیر استفاده کنیم:


<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    public function rules()
    {
        return [
            'title' => 'required|max:200',
            'body' => 'required',
            'tags' => 'required|array|max:10',
            'is_published' => 'required|boolean',
            'author_name' => 'required',
        ];
    }
}

اکنون فرض کنید که یک کاربر یک فرم برای ایجاد یک پست ارسال کرده و داده های ورودی زیر را صادر کرده است:


[
    'title' => 'My bolg post',
    'body' => 'This is the <script>alert('Evil!')</script> post body.',
    'tags' => 'laravel,code,updates',
    'is_published' => 'true',
    'author_name' => 'Ben Sampson',
]

همانطور که می بینید در body باید تگ اسکریپت حذف شود و فیلد tags باید به آرایه تبدیل شود و مقدار is_published باید به boolean تبدیل شود.

The prepareForValidation method

کلاس Illuminate\Foundation\Http\FormRequest و تریت ValidatesWhenResolvedTrait متدی با نام prepareForValidation دارد


protected function prepareForValidation()
{

}

دستکاری داده های درخواست

ما با کمک helper merge در کلاسهای request می توانیم داده های خود را اصلاح کنیم:


<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    public function rules()
    {
        return [
            'title' => 'required|max:200',
            'body' => 'required',
            'tags' => 'required|array|max:10',
            'is_published' => 'required|boolean',
            'author_name' => 'required',
        ];
    }
    protected function prepareForValidation()
    {
        $this->merge([
            'title' => fix_typos($this->title),
            'body' => filter_malicious_content($this->body),
            'tags' => convert_comma_separated_values_to_array($this->tags),
            'is_published' => (bool) $this->is_published,
        ]);
    }
}

همانطور که می بینید با کمک merge helper ما توانستیم مقادیرمان را به شکل زیر اصلاح کنیم:


[
    'title' => 'My blog post',                  // ✅ Typo fixed!
    'body' => 'This is the post body.',         // ✅ Malicious content removed!
    'tags' => ['laravel', 'code', 'updates'],   // ✅ Now an array!
    'is_published' => true,                     // ✅ Now a boolean!
    'author_name' => 'Ben Sampson',             // ✅ Still the same
]

 نویسنده:حمید شاه محمدی
 تعداد مشاهده خبر:(1473)
 هر روز از مقاله های جدید طراحی سایت در کانال تلگرام ما با خبر شوید

 میانگین امتیازات:
 
  تعداد رای دهندگان: {{ count }}
نظرات:

{{ x }}
{{ alert }}

نویسنده:{{ com.name }}
{{ com.body }}
{{ com.created_at }}