در لاراول اعتبارسنجی و ذخیره اطلاعات در دیتابیس چگونه صورت میگیرد؟
در لاراول، روشهای مختلفی برای ذخیره کردن اطلاعات در دیتابیس وجود دارند.
فرض میکنم قصد دارم در متد store مقادیری را در جدول users و از طریق مدل User ذخیره کنم. کافی است یک آبجکت جدید از User ایجاد و از طریق کلاس request اطلاعات ارسال شده توسط فرم را دریافت نمایم و در فیلدهای متناظر در جدول دیتابیس پاس دهم.
در نهایت نیز با استفاده از فانکشن save اطلاعات را ذخیره میکنم.
نکته: این روش هم برای آپدیت کردن کاربرد دارد و هم ایجاد اطلاعات جدید.
public function store(Request $request)
{
$user = new User([
'name' => $request->get('name'),
'email' => $request->get('email'),
]);
$user->save();
}
اما اگر قصد داشته باشم فقط اطلاعات جدیدی را اضافه نمایم، میتوانم از روش زیر استفاده کنم که مخصوص این کار است و برخلاف روش بالا برای آپدیت کردن کاربرد ندارد. همانطور که مشخص است در این روش برخلاف روش فوق، از create به جای save استفاده شده است:
public function store(Request $request)
{
$user = new User([
'name' => $request->get('name'),
'email' => $request->get('email'),
]);
$user->create();
}
اما روش بسیار سادهتری نیز وجود دارد که دیگر نیازی نیست تک به تک فیلدها را دریافت کنیم و تنها به صورت زیر تمامی موارد ارسالی از طریق فرم را دریافت نموده و در جدول مورد نظر ذخیره میکنیم:
public function store(Request $request)
{
$user = new User;
$user->create($request->all());
}
البته کدهای بالا را میتوان به صورت زیر نیز نوشت:
public function store(Request $request,User $user)
{
$user->create($request->all());
}
نکته: باید به یاد داشته باشیم جهت ارسال اطلاعات به دیتابیس و ذخیرهسازی صحیح، لازم است در مدل مربوطه مشخص کنیم که قصد دریافت چه فیلدهایی را داریم تا علاوه بر بالا رفتن امنیت، عملیات به درستی صورت گیرد. همانطور که در زیر مشخص شده است که فیلدهای دریافتی name و email میباشند که باید از طریق مدل مربوطه در جدول متناظر ذخیره شوند.
protected $fillable = ['name','email'];
اما لازم است اطلاعات دریافتی، قبل از ثبت در دیتابیس اعتبارسنجی شوند. در لاراول این کار به سادگی صورت میگیرد و روش کلی کار به این صورت است که validate، فیلدهایی را که نیاز به اعتبارسنجی دارند را به صورت آرایه دریافت و قوانین مورد نظر ما را روی آن بررسی میکند. به فرض من قصد دارم name و email من حتماً از کاربر دریافت شود و همچنین eamil از ساختار eamil پیروی کند و به هیچ وجه در جدول users تکراری نباشد.
public function store(Request $request)
{
$validatedData = $request->validate([
'name' => 'required',
'email' => 'required|email|unique:users,
]);
$user = new User;
$user->create($request->all());
}
حالا هر کدام از قوانین بالا نقض شوند و صحیح نباشند، باید خطای مربوط به کاربر نمایش داده شود که در سمت view میتوانیم به روشهای مختلفی عمل کنیم. مثلاً در زیر اگر email درست وارد نشده باشد، فیلد مربوطه متمایز شده و در زیر آن خطایی نمایش داده خواهد شد که متغیر message که validate آن را ایجاد میکند، حاوی پیام خطا است.
این روش اصطلاحاً روش directive نامیده میشود.
<input type="text" class="form-control @error('email') is-invalid @enderror" name="email">
@error('email')
<div>{{ $message }}</div>
@enderror
روش دیگر نمایش خطاهای اعتبارسنجی به صورت زیر است که تمام خطاها یکجا نمایش داده میشوند و از طریق یک حلقهی foreach آنها را کنترل کردهایم:
@if($errors->any())
<div class="alert alert-danger">
<ul>
@foreach($errors->all() as $error)
<li>
{{ $error }}
</li>
@endforeach
</ul>
</div>
@endif
روش پیشنهادی من برای اعتبارسنجی:
فرض میکنیم قصد اعتبارسنجی فیلدهای قسمت دستهبندی را داریم. ابتدا یک فایل به صورت زیر ایجاد میکنیم:
php artisan make:request CategoryRequest
در داخل فایل ایجاد شده به صورت زیر عمل میکنیم و فقط متد authorize را برابر true قرار میدهیم:
public function rules()
{
return [
'title' => 'required',
'slug' => 'required',
];
}
اگر قصد شخصیسازی پیامها را نیز داشته باشیم، در همین بخش یک متد جدید به صورت زیر ایجاد میکنیم:
public function messages()
{
return [
'title.required' => 'عنوان فارسی دپارتمان نمیتواند خالی باشد',
'slug.required' => 'عنوان انگلیسی دپارتمان نمیتواند خالی باشد',
];
}
در کنترلر هم کافی است که در متد مربوطه به صورت زیر عمل کنیم:
public function store(CategoryRequest $request){
Category::create([
'title' => $request['title'],
'slug' => $request['slug'],
'sort' => $request['sort'],
]);
return redirect(route('category-create'))->with('success','گروه شما به درستی افزوده شد');
}
جهت نمایش خطاها هم در ویوی مربوطه کافی است از یکی از روشهای زیر استفاده کنیم:
نمایش خطا به صورت انفرادی زیر هر فیلد
@error('title')
<div class="text-danger col-sm-5">{{ $message }}</div>
@enderror
یا روش زیر
<input type="text" name="title">
@if($errors->has('title'))
<div class="error">{{ $errors->first('title') }}</div>
@endif
یا نمایش خطاها به صورت یکجا به یکی از دو روش زیر
@if($errors->any())
@foreach ($errors->all() as $error)
<div>{{$error}}</div>
@endforeach
@endif
@if($errors->any())
{!! implode('', $errors->all('<div>:message</div>')) !!}
@endif
توی وبسایتم سعی میکنم محتوایی که تصور کنم ارزشمنده و به بقیه کمکی میکنه رو منتشر کنم. امیدوارم از مطالب وبسایت بتونید استفاده کنید و به کارتون بیاد. در ضمن اگه پروژهی تحت وبی دارید که نیاز به برنامهنویسی و اجرا داره، میتونید با شماره انتهای صفحه با من تماس بگیرید تا در موردش با هم صحبت کنیم.