وقتی کاربر اطلاعاتی را از طریق یک فرم، API یا هر رابط دیگری به برنامه Laravel ارسال میکند، نمیتوانیم فرض کنیم که اطلاعات ارسالشده همیشه صحیح، کامل یا قابل اعتماد هستند.
ممکن است کاربر:
- یک فیلد ضروری را خالی بگذارد.
- یک ایمیل نامعتبر وارد کند.
- بهجای عدد، متن ارسال کند.
- مقدار بسیار طولانی ارسال کند.
- فایلی با فرمت نامعتبر آپلود کند.
- مقداری ارسال کند که در Database وجود ندارد.
- مقداری ارسال کند که قبلاً استفاده شده است.
- حتی عمداً دادهای غیرمنتظره برای برنامه ارسال کند.
اینجاست که Validation در Laravel اهمیت پیدا میکند.
Validation یا اعتبارسنجی دادهها فرآیندی است که در آن دادههای ورودی را قبل از پردازش نهایی بررسی میکنیم تا مطمئن شویم شرایط موردنظر برنامه را دارند.
Laravel سیستم Validation قدرتمندی در اختیار توسعهدهندگان قرار داده که با استفاده از آن میتوان بدون نوشتن حجم زیادی از کد، فرمها، APIها و ورودیهای مختلف را اعتبارسنجی کرد.
در این مقاله با Validation در Laravel از پایه تا کاربردهای مهم و عملی آن آشنا میشویم.
# Validation در Laravel چیست؟
Validation در Laravel سیستمی برای بررسی معتبر بودن دادههای ورودی است.
فرض کنید یک فرم ثبتنام داریم:
Name
Email
Password
میخواهیم قوانین زیر را داشته باشیم:
- نام الزامی باشد.
- ایمیل الزامی و معتبر باشد.
- رمز عبور حداقل ۸ کاراکتر داشته باشد.
در Laravel میتوانیم این قوانین را به شکل زیر تعریف کنیم:
$request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'email'],
'password' => ['required', 'string', 'min:8'],
]);
Laravel دادههای Request را بررسی میکند.
اگر دادهها معتبر باشند، اجرای برنامه ادامه پیدا میکند.
اگر معتبر نباشند، Validation شکست میخورد و Laravel فرآیند مناسب نمایش یا بازگرداندن خطاها را انجام میدهد.
# چرا Validation در Laravel اهمیت دارد؟
Validation فقط برای نمایش پیام خطا به کاربر نیست.
یک سیستم Validation مناسب به دلایل مختلف اهمیت دارد.
جلوگیری از ورود دادههای اشتباه
مثلاً اگر قیمت محصول باید عدد باشد، نباید مقدار زیر را قبول کنیم:
one million
بلکه باید داده مناسب دریافت شود.
بهبود تجربه کاربری
اگر کاربر ایمیل اشتباه وارد کند، بهتر است دقیقاً متوجه شود مشکل کجاست.
مثلاً:
The email field must be a valid email address.
جلوگیری از خطاهای برنامه
اگر برنامه انتظار عدد داشته باشد ولی یک مقدار نامعتبر دریافت کند، ممکن است در مراحل بعدی با خطا مواجه شود.
افزایش امنیت
Validation بهتنهایی سیستم امنیتی کامل نیست، اما یکی از لایههای مهم کنترل ورودیهای برنامه محسوب میشود.
# Validation چه ارتباطی با Request دارد؟
در مقاله قبلی درباره Request و Response در Laravel صحبت کردیم.
Request اطلاعاتی را که Client ارسال کرده در اختیار برنامه قرار میدهد.
مثلاً:
$name = $request->input('name');
اما این کد فقط داده را دریافت میکند.
نمیگوید:
- آیا
nameوجود دارد؟ - آیا رشته است؟
- آیا طول مناسبی دارد؟
- آیا مقدار قابل قبول است؟
Validation دقیقاً در مرحله بعد وارد میشود.
یعنی:
Request
↓
دریافت داده
↓
Validation
↓
داده معتبر
↓
پردازش
# سادهترین روش Validation در Laravel
یکی از سادهترین روشهای Validation استفاده از متد validate() روی Request است.
مثلاً:
use Illuminate\Http\Request;
public function store(Request $request)
{
$request->validate([
'name' => ['required'],
'email' => ['required', 'email'],
]);
// ادامه پردازش
}
در این مثال Laravel دو قانون تعریف کرده است.
برای name:
'required'
و برای email:
'required'
'email'
اگر Validation موفق باشد، برنامه به خط بعدی میرسد.
# Rule در Laravel چیست؟
Rule یا قانون Validation مشخص میکند یک فیلد باید چه شرایطی داشته باشد.
مثلاً:
'name' => ['required']
یعنی فیلد name باید وجود داشته باشد.
یا:
'email' => ['email']
یعنی مقدار email باید ساختار یک ایمیل معتبر را داشته باشد.
میتوان چند Rule را برای یک فیلد استفاده کرد:
'password' => [
'required',
'string',
'min:8',
]
در اینجا Password باید:
- وجود داشته باشد.
- رشته باشد.
- حداقل ۸ کاراکتر داشته باشد.
# Rule موردنیاز با required
یکی از پرکاربردترین Ruleها:
required
است.
مثلاً:
$request->validate([
'name' => ['required'],
]);
یعنی name باید مقدار داشته باشد.
مثلاً برای فرم ثبت محصول:
$request->validate([
'name' => ['required'],
'price' => ['required'],
]);
# Validation برای رشته با string
اگر انتظار داریم مقدار یک فیلد رشته باشد:
'name' => ['string']
میتوانیم آن را همراه required استفاده کنیم:
'name' => [
'required',
'string',
]
این الگو برای نام، عنوان، توضیحات و بسیاری از فیلدهای متنی کاربرد دارد.
# محدود کردن طول با min و max
فرض کنید نام محصول باید حداقل ۳ کاراکتر باشد:
'name' => [
'required',
'string',
'min:3',
]
برای تعیین حداکثر طول:
'name' => [
'required',
'string',
'max:255',
]
یا هر دو:
'name' => [
'required',
'string',
'min:3',
'max:255',
]
این روش برای جلوگیری از دریافت دادههای بسیار کوتاه یا بیش از حد طولانی مفید است.
# اعتبارسنجی ایمیل
برای بررسی فرمت ایمیل میتوان از Rule مربوط به email استفاده کرد:
'email' => [
'required',
'email',
]
مثلاً:
$request->validate([
'email' => ['required', 'email'],
]);
این Validation بررسی میکند مقدار ارسالشده ساختار مناسب یک ایمیل را داشته باشد.
# اعتبارسنجی عدد با numeric
اگر یک فیلد باید مقدار عددی داشته باشد، میتوان از:
numeric
استفاده کرد.
مثلاً:
'price' => [
'required',
'numeric',
]
این Rule برای مواردی مانند قیمت، مقدار، درصد و دادههای عددی کاربرد دارد.
# integer چیست؟
اگر مقدار باید عدد صحیح باشد، میتوان از:
integer
استفاده کرد.
مثلاً:
'age' => [
'required',
'integer',
]
در این حالت مقدار باید عدد صحیح باشد.
# Validation برای Boolean
برای مقادیری مانند فعال یا غیرفعال میتوان از Rule مناسب برای Boolean استفاده کرد.
مثلاً:
'is_active' => [
'required',
'boolean',
]
این کاربرد در پنلهای مدیریت بسیار رایج است.
مثلاً:
is_active = true
یا مقدار مناسب دیگری که Laravel برای Boolean قبول میکند.
# nullable در Laravel
گاهی یک فیلد الزامی نیست اما اگر ارسال شد باید معتبر باشد.
در این شرایط nullable کاربرد دارد.
مثلاً:
'phone' => [
'nullable',
'string',
]
یعنی:
- ارسال
phoneالزامی نیست. - اگر مقدار ارسال شود، باید شرایط Ruleهای دیگر را داشته باشد.
این موضوع برای فیلدهای اختیاری بسیار مفید است.
# تفاوت required و nullable
مثلاً:
'phone' => ['required', 'string']
یعنی Phone حتماً باید وجود داشته باشد.
اما:
'phone' => ['nullable', 'string']
یعنی Phone میتواند خالی باشد.
این تفاوت در طراحی فرمهای واقعی اهمیت زیادی دارد.
# Rule مربوط به unique
یکی از کاربردهای بسیار مهم Validation بررسی تکراری نبودن مقدار در Database است.
مثلاً فرض کنید ایمیل کاربران باید یکتا باشد.
میتوان از Rule unique استفاده کرد:
'email' => [
'required',
'email',
'unique:users,email',
]
در این حالت Laravel بررسی میکند که مقدار ایمیل در جدول users برای ستون email تکراری نباشد.
این Rule برای مواردی مانند:
- Username
- Slug
- کد محصول
- کد ملی در صورت طراحی مناسب سیستم
کاربرد دارد.
# Rule مربوط به exists
برعکس unique، گاهی میخواهیم بررسی کنیم یک مقدار در Database وجود دارد.
برای این کار میتوان از exists استفاده کرد.
مثلاً:
'category_id' => [
'required',
'exists:categories,id',
]
یعنی مقدار category_id باید در ستون id جدول categories وجود داشته باشد.
این Rule برای فرمهایی که با روابط Database کار میکنند بسیار کاربردی است.
# Validation چند فیلد بهصورت همزمان
میتوانیم چندین فیلد را در یک Validation بررسی کنیم:
$request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'email'],
'age' => ['nullable', 'integer'],
'phone' => ['nullable', 'string'],
]);
Laravel تمام قوانین را بررسی میکند.
این روش در فرمهای ثبتنام، ثبت محصول، ایجاد سفارش و پنلهای مدیریت بسیار رایج است.
# نمایش خطاهای Validation در Blade
اگر Validation مربوط به یک فرم وب با Blade شکست بخورد، Laravel امکان استفاده از خطاهای Validation را فراهم میکند.
در Blade میتوانیم بررسی کنیم:
@error('email')
<div>
{{ $message }}
</div>
@enderror
اگر Validation مربوط به email شکست خورده باشد، پیام خطا نمایش داده میشود.
# نمایش تمام خطاهای Validation
میتوانیم تمام خطاها را نیز نمایش دهیم:
@if ($errors->any())
<div>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
این روش برای نمایش عمومی خطاهای فرم مفید است.
# استفاده از old() در فرم
بعد از شکست Validation معمولاً نمیخواهیم کاربر تمام اطلاعات فرم را دوباره وارد کند.
در Blade میتوانیم از old() استفاده کنیم:
<input
type="text"
name="name"
value="{{ old('name') }}"
>
اگر کاربر قبلاً نامی وارد کرده باشد و Validation به دلیل خطای دیگری شکست بخورد، مقدار قبلی میتواند دوباره در فرم نمایش داده شود.
برای ایمیل:
<input
type="email"
name="email"
value="{{ old('email') }}"
>
# نمایش خطای کنار هر فیلد
یک ساختار مناسب برای فرم:
<div>
<label for="email">
ایمیل
</label>
<input
id="email"
type="email"
name="email"
value="{{ old('email') }}"
>
@error('email')
<span>
{{ $message }}
</span>
@enderror
</div>
این ساختار تجربه کاربری خوبی ایجاد میکند؛ چون خطای هر فیلد دقیقاً کنار همان فیلد نمایش داده میشود.
# شخصیسازی پیام Validation
گاهی پیام پیشفرض Laravel برای پروژه مناسب نیست.
میتوانیم پیامهای سفارشی تعریف کنیم.
برای مثال:
$request->validate(
[
'name' => ['required'],
'email' => ['required', 'email'],
],
[
'name.required' => 'وارد کردن نام الزامی است.',
'email.required' => 'وارد کردن ایمیل الزامی است.',
'email.email' => 'فرمت ایمیل صحیح نیست.',
]
);
این قابلیت برای پروژههای فارسی بسیار کاربردی است.
# تغییر نام فیلدها در پیام خطا
میتوانیم نام قابلنمایش فیلدها را نیز مشخص کنیم:
$request->validate(
[
'name' => ['required'],
'email' => ['required', 'email'],
],
[],
[
'name' => 'نام',
'email' => 'ایمیل',
]
);
این کار باعث میشود پیامهای Validation برای کاربر طبیعیتر باشند.
# Validation برای Password
مثلاً در فرم ثبتنام:
$request->validate([
'password' => [
'required',
'string',
'min:8',
],
]);
اگر Password و Password Confirmation نیز داشته باشیم، میتوان از Rule مربوط به confirmed استفاده کرد:
'password' => [
'required',
'string',
'min:8',
'confirmed',
],
در فرم نیز فیلدی با نام مناسب برای تأیید رمز عبور ارسال میشود.
مثلاً:
<input type="password" name="password">
<input type="password" name="password_confirmation">
# Validation فایل در Laravel
برای آپلود فایل نیز Validation اهمیت بسیار زیادی دارد.
مثلاً:
$request->validate([
'image' => [
'required',
'image',
'max:2048',
],
]);
در این مثال:
- فایل الزامی است.
- باید یک تصویر معتبر باشد.
- اندازه فایل نیز محدود شده است.
برای محدود کردن فرمت فایل نیز میتوان Ruleهای مناسب را به Validation اضافه کرد.
# Validation آرایهها
گاهی دادهها بهصورت آرایه ارسال میشوند.
مثلاً:
products[]
products[]
products[]
یا در API:
{
"products": [
1,
2,
3
]
}
میتوان ساختار چنین دادههایی را نیز Validation کرد.
مثلاً:
$request->validate([
'products' => ['required', 'array'],
'products.*' => ['integer'],
]);
در این حالت:
productsباید آرایه باشد.- هر عضو آن باید عدد صحیح باشد.
این قابلیت در سیستمهای سفارش، سبد خرید و فرمهای چندردیفی کاربرد زیادی دارد.
# Validation شرطی
گاهی یک فیلد فقط در شرایط خاصی الزامی است.
مثلاً اگر نوع حساب company باشد، نام شرکت باید وارد شود.
در چنین شرایطی میتوان از Ruleهای شرطی استفاده کرد.
یکی از Ruleهای رایج:
required_if
مثلاً:
'company_name' => [
'required_if:account_type,company',
]
یعنی اگر account_type برابر company باشد، company_name نیز الزامی است.
این قابلیت برای فرمهای پیچیده بسیار مفید است.
# sometimes در Validation
گاهی میخواهیم یک فیلد فقط زمانی که در Request وجود دارد Validation شود.
برای چنین سناریوهایی sometimes کاربرد دارد.
مثلاً:
$request->validate([
'name' => ['sometimes', 'string', 'max:255'],
]);
این نوع Validation در فرمهای Update و APIهایی که همه فیلدها در هر درخواست ارسال نمیشوند، کاربرد زیادی دارد.
# Validation در Update چه تفاوتی دارد؟
فرض کنید هنگام ایجاد کاربر، ایمیل باید یکتا باشد:
'email' => [
'required',
'email',
'unique:users,email',
],
اما هنگام ویرایش همان کاربر، ایمیل فعلی خودش نباید باعث خطای Unique شود.
در اینجا Validation مربوط به Update نیازمند توجه به رکورد فعلی است.
برای پروژههای واقعی، بهتر است Ruleهای Database را با ساختار مناسب و Ruleهای جدیدتر Laravel بنویسیم تا کد خواناتر و قابل نگهداریتر باشد.
# استفاده از Rule Class در Laravel
برای Ruleهای پیچیده میتوان Validation را از رشتههای ساده جدا کرد.
مثلاً:
use Illuminate\Validation\Rule;
سپس:
'email' => [
'required',
'email',
Rule::unique('users', 'email'),
],
این روش بهخصوص زمانی مفید است که Rule نیاز به تنظیمات بیشتری داشته باشد.
# Validation برای API
Validation فقط برای فرمهای HTML نیست.
در API نیز بسیار مهم است.
مثلاً:
public function store(Request $request)
{
$validated = $request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'email'],
]);
return response()->json([
'success' => true,
'data' => $validated,
]);
}
اگر دادهها معتبر باشند، پردازش ادامه پیدا میکند.
اگر Validation شکست بخورد، Laravel میتواند پاسخ مناسب برای API ایجاد کند.
# دریافت دادههای Validationشده
یک روش مناسب این است که بهجای استفاده مداوم از کل Request، دادههای Validationشده را دریافت کنیم.
مثلاً:
$validated = $request->validate([
'name' => ['required', 'string'],
'email' => ['required', 'email'],
]);
سپس:
$name = $validated['name'];
$email = $validated['email'];
مزیت این روش این است که مشخص است کدام دادهها از فیلتر Validation عبور کردهاند.
# تفاوت Validation با Sanitization
Validation و Sanitization یکی نیستند.
Validation بررسی میکند داده معتبر است یا خیر.
مثلاً:
آیا ایمیل معتبر است؟
اما Sanitization به فرآیند پاکسازی یا آمادهسازی داده برای استفاده خاص اشاره میکند.
این دو مفهوم ممکن است در یک پروژه در کنار یکدیگر استفاده شوند، اما نباید آنها را یکسان در نظر گرفت.
همچنین Validation بهتنهایی جایگزین تمام اقدامات امنیتی نیست.
# Validation و Security
یکی از اشتباهات رایج این است که تصور کنیم:
> اگر داده را Validation کنیم، دیگر همه مشکلات امنیتی حل شدهاند.
این تصور درست نیست.
یک برنامه Laravel علاوه بر Validation به موارد دیگری نیز نیاز دارد، مانند:
- Authentication
- Authorization
- CSRF Protection
- کنترل دسترسی
- جلوگیری از SQL Injection
- جلوگیری از XSS
- مدیریت صحیح فایلها
- مدیریت Secretها
- محدود کردن Requestها در سناریوهای لازم
Validation یکی از لایههای محافظتی برنامه است، نه تمام سیستم امنیتی.
# اشتباهات رایج در Validation Laravel
۱. فقط Validation سمت کاربر
ممکن است در JavaScript فرم را بررسی کنیم، اما این کافی نیست.
Client میتواند مستقیماً Request به Server ارسال کند.
بنابراین Validation سمت Server ضروری است.
۲. استفاده از Ruleهای بسیار ساده برای دادههای حساس
مثلاً:
'amount' => ['required']
برای یک مبلغ مالی معمولاً کافی نیست.
باید متناسب با منطق کسبوکار، نوع داده، محدوده و شرایط آن Validation مناسب طراحی شود.
۳. اعتماد به نام فیلدهای فرم
نباید تصور کنیم چون Frontend فقط name و email ارسال میکند، کاربر نمیتواند فیلد دیگری ارسال کند.
برای همین باید دقیقاً مشخص کنیم چه دادههایی مورد قبول هستند.
۴. قرار دادن تمام Validationها در Controllerهای بزرگ
اگر Controller بسیار بزرگ شود و دهها Rule مختلف داشته باشد، نگهداری آن دشوار خواهد شد.
اینجاست که Form Request اهمیت پیدا میکند.
Form Request موضوع مقاله بعدی همین کلاستر است.
# Validation یا Form Request؛ کدام را استفاده کنیم؟
برای Validationهای ساده میتوان از این روش استفاده کرد:
$request->validate([
'name' => ['required'],
'email' => ['required', 'email'],
]);
اما اگر فرم پیچیده باشد، بهتر است Validation را در یک کلاس جداگانه قرار دهیم.
مثلاً:
StoreProductRequest
UpdateProductRequest
RegisterUserRequest
LoginRequest
در Laravel به این ساختار Form Request گفته میشود.
مزیت آن این است که Controller خلوتتر میشود و Validation ساختارمندتر خواهد بود.
# یک مثال کامل Validation در Laravel
فرض کنید میخواهیم فرم ایجاد محصول بسازیم.
قوانین:
- نام الزامی باشد.
- نام رشته باشد.
- حداکثر ۲۵۵ کاراکتر داشته باشد.
- قیمت الزامی باشد.
- قیمت عددی باشد.
- دستهبندی الزامی باشد.
- دستهبندی در Database وجود داشته باشد.
Validation:
$request->validate([
'name' => [
'required',
'string',
'max:255',
],
'price' => [
'required',
'numeric',
],
'category_id' => [
'required',
'exists:categories,id',
],
]);
سپس دادههای معتبر:
$validated = $request->validate([
'name' => [
'required',
'string',
'max:255',
],
'price' => [
'required',
'numeric',
],
'category_id' => [
'required',
'exists:categories,id',
],
]);
و بعد میتوانیم از $validated برای ادامه منطق برنامه استفاده کنیم.
# بهترین روشها برای Validation در Laravel
برای پروژههای واقعی بهتر است این اصول را رعایت کنید:
۱. Validation را همیشه در سمت Server انجام دهید
Validation سمت Frontend بهتنهایی قابل اعتماد نیست.
۲. فقط دادههای موردنیاز را قبول کنید
تمام Request را بدون بررسی وارد منطق برنامه نکنید.
۳. Ruleها را متناسب با منطق کسبوکار طراحی کنید
Validation فرم ثبتنام با Validation سیستم پرداخت یکسان نیست.
۴. Validationهای پیچیده را به Form Request منتقل کنید
این کار باعث خلوتتر شدن Controller میشود.
۵. پیامهای خطا را برای کاربر قابل فهم کنید
بهخصوص در پروژههای فارسی، پیامهای مناسب تجربه کاربری را بهتر میکنند.
۶. Validation را جایگزین Authorization نکنید
اینکه داده معتبر است به این معنی نیست که کاربر اجازه انجام عملیات را دارد.
# جمعبندی
Validation در Laravel یکی از مهمترین ابزارهای توسعه برنامههای امن و قابل اعتماد است.
Request دادهها را وارد برنامه میکند، اما Validation مشخص میکند این دادهها آیا شرایط موردنظر برنامه را دارند یا خیر.
Laravel مجموعه بزرگی از Ruleها را برای این کار در اختیار توسعهدهنده قرار میدهد؛ از Ruleهای ساده مانند:
required
و:
string
تا Ruleهای کاربردی مانند:
email
numeric
integer
nullable
unique
exists
confirmed
required_if
و بسیاری از Ruleهای دیگر.
برای Validationهای ساده میتوان مستقیماً از:
$request->validate()
استفاده کرد.
اما زمانی که پروژه بزرگتر میشود و فرمها و قوانین پیچیدهتری داریم، بهتر است Validation را به Form Request منتقل کنیم.
به همین دلیل، بعد از یادگیری Request، Response و Validation، قدم طبیعی بعدی در مسیر یادگیری Laravel، شناخت کامل Form Request است.
# سوالات متداول
Validation در Laravel چیست؟
Validation سیستمی برای بررسی معتبر بودن دادههای ورودی قبل از پردازش آنها در برنامه Laravel است.
سادهترین روش Validation در Laravel چیست؟
میتوان از متد validate() روی Request استفاده کرد:
$request->validate([
'name' => ['required'],
]);
آیا Validation برای API هم استفاده میشود؟
بله. Validation در Laravel برای APIها نیز کاربرد دارد و میتواند در صورت نامعتبر بودن دادهها، Response مناسب ایجاد کند.
Rule در Laravel چیست؟
Rule قانونی است که مشخص میکند یک مقدار باید چه شرایطی داشته باشد؛ مانند required، email، string، min و max.
unique در Laravel چه کاربردی دارد؟
برای بررسی یکتا بودن یک مقدار در Database استفاده میشود؛ مثلاً جلوگیری از ثبت ایمیل تکراری.
exists در Laravel چه کاربردی دارد؟
برای بررسی وجود یک مقدار در Database استفاده میشود؛ مثلاً بررسی اینکه category_id واقعاً در جدول دستهبندیها وجود داشته باشد.
nullable در Laravel چیست؟
مشخص میکند که یک فیلد میتواند مقدار null داشته باشد، در حالی که اگر مقدار دیگری ارسال شود میتوان Ruleهای دیگر را روی آن اعمال کرد.
چگونه پیام خطای Validation را در Blade نمایش دهیم؟
میتوان از @error استفاده کرد:
@error('email')
{{ $message }}
@enderror
تفاوت Validation و Form Request چیست؟
Validation یک مفهوم کلی برای اعتبارسنجی دادهها است؛ Form Request روشی ساختاریافته برای قرار دادن قوانین Validation و منطق مرتبط با مجوز درخواست در یک کلاس جداگانه است.
آیا Validation بهتنهایی امنیت برنامه را تضمین میکند؟
خیر. Validation فقط یکی از لایههای محافظتی برنامه است و باید در کنار Authentication، Authorization، CSRF Protection و سایر اصول امنیتی استفاده شود.





