چطور پیامهای اعتبارسنجی در لاراول را شخصیسازی کنم و پیام مناسبی به کاربر نمایش دهم؟
یکی از سادهترین روشهای شخصیسازی پیامهای خطای مربوط به اعتبارسنجی در لاراول به صورت زیر است:
public function store(Request $request,User $user)
{
$alerts = [
'name.required' => 'وارد کردن نام الزامی است',
'email.required' => 'وارد کردن ایمیل الزامی است',
'email.email' => 'فرمت ایمیل صحیح نیست',
'email.unique' => 'ایمیل وارد شده تکراری است',
];
$validatedData = $request->validate([
'name' => 'required',
'email' => 'required|email|unique:users,
], $alerts);
$user->create($request->all());
}
همانطور که قابل ملاحظه است، validate پارامتر دومی نیز قبول میکند که من در اینجا یک آرایه با نام alerts را به آن پاس دادهام. در ابتدای کد نیز مشخص است که این آرایه برای هر فیلد و رویدادِ قابل بررسی، شامل مقداری است که پیام ما را تشکیل میدهد و این مقادیر به عنوان نتیجهی اعتبارسنجی به کاربر نمایش داده خواهند شد.
اما اگر اعتبارسنجی با موفقیت صورت گرفت، باید پیام مناسبی مبنی بر موفقیت آمیز بودن پروسه به کاربر نمایش دهیم که به شکل زیر کد قبلی را بازنویسی میکنم:
public function store(Request $request,User $user)
{
$alerts = [
'name.required' => 'وارد کردن نام الزامی است',
'email.required' => 'وارد کردن ایمیل الزامی است',
'email.email' => 'فرمت ایمیل صحیح نیست',
'email.unique' => 'ایمیل وارد شده تکراری است',
];
$validatedData = $request->validate([
'name' => 'required',
'email' => 'required|email|unique:users,
], $alerts);
$user->create($request->all());
$success_msg = 'عملیات با موفقیت انجام پذیرفت';
return redirect(route('users'))->with('success',$success_msg);
}
همانطور که مشخص است، در انتهای کد یک پیغام را داخل متغیر success_msg قرار دادهام و پس از موفقیت آمیز بودن رویداد، کاربر را به مسیر users هدایت میکنم و متغیر حاوی پیام را با نام success به view خود پاس میدهم.
در سمت view نیز پیام را به صورت زیر هندل میکنم که میگوید اگر سشنی با عنوان success وجود دارد، محتویات آن را چاپ کن.
if(session('success'))
{{ session('success') }}
@endif
حالا فرض میگیرم به هر دلیلی اتفاقی افتاده و یک خطای ناخواسته رخ میدهد. نیاز است که من خطاهای پیشبینی نشده را هندل کنم. در اینجا از try{}catch استفاده میکنم. قبل از آن حتماً باید کلاس Exception را use کنم:
use Exception;
سپس کدهای قبلی را به شکل زیر بازنویسی میکنم:
public function store(Request $request,User $user)
{
$alerts = [
'name.required' => 'وارد کردن نام الزامی است',
'email.required' => 'وارد کردن ایمیل الزامی است',
'email.email' => 'فرمت ایمیل صحیح نیست',
'email.unique' => 'ایمیل وارد شده تکراری است',
];
$validatedData = $request->validate([
'name' => 'required',
'email' => 'required|email|unique:users,
], $alerts);
try{
$user->create($request->all());
}catch(Exception $exception){
switch($exception->getCode())
{
case 23000:
$error_code_msg = 'رکورد مورد نظر قبلاً وارد شده است';
break;
}
return redirect(route('users'))->with('warning',$exception->getCode());
//return redirect(route('users'))->with('warning',$exception->getMessage());
//return redirect(route('users'))->with('warning',$error_code_msg;
}
$success_msg = 'عملیات با موفقیت انجام پذیرفت';
return redirect(route('users'))->with('success',$success_msg);
}
در قسمت try گفتهام که به هر دلیلی اگر ذخیرهی دیتا با خطا مواجه شد آن را catch کن و یک Exception با خطای مربوطه ایجاد کن و سپس عملیات انتقال که حاوی کد خطا یا خود پیغام خطا (که در اینجا آن را کامنت کردهام) باشد را به ویوی من ارسال کن.
فکر میکنم نیازی به گفتن نیست که در سمت ویو نیز به سادگی امکان نمایش وجود دارد و کافی است از کدی مثل زیر استفاده کنیم:
if(session('warning'))
{{ session('warning') }}
@endif
نکته: در کد بالا برای اینکه کدهای خطا را نیز هندل کرده باشم، میتوانم مانند نمونه از یک سوئیچ استفاده کرده و کدهای خطا را وارد و پیام مورد نظر را در ویوی مورد نظر به کاربر نمایش دهم که نمونهی آن را نیز در کد بالا کامنت کردهام.
نکته: در پُست دیگرم با عنوان «در لاراول اعتبارسنجی و ذخیره اطلاعات در دیتابیس چگونه صورت میگیرد؟» روش دیگری از اعتبارسنجی و نمایش پیام دلخواه را بیان کردهام که مطالعهی آن خالی از لطف نیست.
توی وبسایتم سعی میکنم محتوایی که تصور کنم ارزشمنده و به بقیه کمکی میکنه رو منتشر کنم. امیدوارم از مطالب وبسایت بتونید استفاده کنید و به کارتون بیاد. در ضمن اگه پروژهی تحت وبی دارید که نیاز به برنامهنویسی و اجرا داره، میتونید با شماره انتهای صفحه با من تماس بگیرید تا در موردش با هم صحبت کنیم.