در فریم ورک لاراول هنگام استفاده از 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 تبدیل شود.
کلاس 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
]