إنشاء سلة مشتريات في Laravel 5: دليل عملي شامل ومفصل
يُعد بناء سلة مشتريات (Shopping Cart) أحد أبرز المكونات في أي تطبيق تجارة إلكترونية. وهي نقطة مركزية في تجربة المستخدم تسمح له بإدارة المنتجات التي يود شراءها، تعديل الكميات، حذف العناصر، أو المتابعة لعملية الدفع. يعتبر Laravel 5 إطار عمل قوي وحديث يُسهل هذه المهمة بفضل بنيته المعمارية النظيفة، واعتماده على الـ MVC، ودعمه لأنماط تصميم موجهة للكائنات. سنتناول في هذا المقال، بأسلوب مفصل وشامل، كيفية إنشاء سلة مشتريات باستخدام Laravel 5، مع مراعاة تنظيم الكود، وتحسين الأداء، وضمان الأمان، وتقديم تجربة مستخدم احترافية.
أهمية سلة المشتريات في تطبيقات Laravel
سلة المشتريات ليست مجرد ميزة ثانوية، بل تشكّل قلب نظام التجارة الإلكترونية، ومن خلالها يتم التحكم في عملية الشراء، احتساب التكاليف، تطبيق الخصومات، احتساب الضرائب، وتحديث بيانات المخزون. في Laravel 5، بفضل خصائص مثل الجلسات (Sessions)، المستودعات (Repositories)، الخدمات (Services)، والواجهات (Interfaces)، يمكننا بناء سلة مشتريات مرنة وقابلة للتطوير بسهولة.
البنية المقترحة لمشروع Laravel 5
لضمان جودة المشروع واستقراره، يُنصح بالبدء بإنشاء بنية واضحة للمجلدات والملفات تشمل:
-
Controllers: لتنظيم عمليات التحكم مثل الإضافة، الحذف، والتحديث.
-
Models: لتعريف البيانات (مثل المنتج).
-
Views: لتقديم واجهة المستخدم.
-
Routes: لتحديد النقاط النهائية التي يتفاعل معها المستخدم.
-
Services: لفصل منطق العمل عن الـ Controllers.
-
Middleware: لحماية الوصول وإدارة الجلسات.
إعداد بيئة العمل
لبدء مشروع Laravel 5، يجب أولاً التأكد من تثبيت الأدوات الأساسية:
-
PHP >= 5.5.9
-
Composer
-
MySQL / SQLite
-
Laravel Installer أو
composer create-project
bashcomposer create-project --prefer-dist laravel/laravel laravel-cart "5.5.*"
إنشاء نموذج البيانات للمنتجات
لإنشاء سلة مشتريات، نحتاج أولاً إلى نموذج بيانات يمثل المنتجات.
bashphp artisan make:model Product -m
ثم في ملف التهجير database/migrations/xxxx_create_products_table.php:
phpSchema::create('products', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->text('description')->nullable();
$table->decimal('price', 8, 2);
$table->string('image')->nullable();
$table->timestamps();
});
نفذ الأمر:
bashphp artisan migrate
إنشاء نظام سلة المشتريات باستخدام Session
بما أن Laravel يوفر دعمًا قويًا للجلسات، يمكننا استخدام الجلسة لتخزين بيانات سلة المشتريات مؤقتًا، مع إمكانية لاحقة لتخزينها في قاعدة البيانات.
إنشاء CartController
bashphp artisan make:controller CartController
منطق الإضافة إلى السلة
phppublic function addToCart($id)
{
$product = Product::findOrFail($id);
$cart = session()->get('cart', []);
if (isset($cart[$id])) {
$cart[$id]['quantity']++;
} else {
$cart[$id] = [
"name" => $product->name,
"quantity" => 1,
"price" => $product->price,
"image" => $product->image
];
}
session()->put('cart', $cart);
return redirect()->back()->with('success', 'تمت إضافة المنتج إلى السلة بنجاح');
}
عرض السلة
phppublic function viewCart()
{
$cart = session()->get('cart');
return view('cart.index', compact('cart'));
}
حذف عنصر من السلة
phppublic function removeFromCart($id)
{
$cart = session()->get('cart');
if (isset($cart[$id])) {
unset($cart[$id]);
session()->put('cart', $cart);
}
return redirect()->back()->with('success', 'تم حذف المنتج من السلة');
}
تحديث الكمية
phppublic function updateCart(Request $request)
{
if ($request->id && $request->quantity) {
$cart = session()->get('cart');
$cart[$request->id]['quantity'] = $request->quantity;
session()->put('cart', $cart);
return redirect()->back()->with('success', 'تم تحديث السلة');
}
}
تعريف المسارات (Routes)
phpRoute::get('cart', 'CartController@viewCart')->name('cart.view');
Route::get('add-to-cart/{id}', 'CartController@addToCart')->name('cart.add');
Route::patch('update-cart', 'CartController@updateCart')->name('cart.update');
Route::delete('remove-from-cart/{id}', 'CartController@removeFromCart')->name('cart.remove');
إنشاء الواجهات (Views)
عرض السلة (resources/views/cart/index.blade.php)
blade@extends('layouts.app') @section('content')@endsectionسلة المشتريات
@if(session('cart'))
@php $total = 0 @endphp @foreach(session('cart') as $id => $details) @php $total += $details['price'] * $details['quantity'] @endphp المنتج الكمية السعر المجموع الإجراء @endforeach {{ $details['name'] }} {{ $details['price'] }} {{ $details['price'] * $details['quantity'] }} الإجمالي: {{ $total }}
@elseالسلة فارغة
@endif
الجدول الفني لتخزين السلة
| الحقل | النوع | الوصف |
|---|---|---|
product_id |
INT | معرف المنتج |
name |
VARCHAR | اسم المنتج |
quantity |
INT | عدد القطع في السلة |
price |
DECIMAL(8,2) | سعر القطعة الواحدة |
image |
VARCHAR | رابط الصورة |
session_id |
VARCHAR | معرف الجلسة (عند استخدام قاعدة بيانات) |
تحسينات متقدمة
حماية من التلاعب في الأسعار
يجب عدم الاعتماد على بيانات السعر القادمة من الواجهة الأمامية، بل يجب جلب السعر من قاعدة البيانات دائمًا.
حفظ السلة للمستخدم المسجل
عند تسجيل الدخول، يمكن تخزين السلة في قاعدة البيانات لربطها بحساب المستخدم.
الدمج مع بوابة دفع إلكتروني
بعد التأكد من محتويات السلة، يمكن نقل المستخدم إلى صفحة الدفع وإرسال إجمالي الفاتورة مع تفاصيل المنتجات.
الأداء والأمان
-
استخدام
Middlewareلتقييد الوصول للسلة. -
تنظيف الجلسات المنتهية تلقائيًا.
-
تخزين السلة في قاعدة بيانات في حال كانت الجلسة غير كافية.
-
تأكيد على تحديث الكميات بما يتماشى مع المخزون الفعلي.
توسيع سلة المشتريات
بعد الانتهاء من الوظائف الأساسية، يمكن توسيع النظام بإضافة:
-
تطبيق كوبونات الخصم.
-
احتساب الضرائب حسب الموقع الجغرافي.
-
دعم خيارات الشحن.
-
إدارة سلال متعددة.
خاتمة تقنية
إن بناء سلة مشتريات باستخدام Laravel 5 يوفر تحكمًا شاملاً في تجربة المستخدم وإدارة الطلبات بشكل احترافي. بفضل بنية Laravel المرنة، يمكن دمج هذه السلة بسهولة مع الأنظمة الأخرى مثل الدفع، الفوترة، وتتبّع الشحن. كما يُعد استخدام الجلسات بداية ممتازة للمشاريع الصغيرة، ويمكن التوسع تدريجياً نحو حفظ دائم باستخدام قاعدة البيانات. عند اعتماد هذا النهج، يصبح التطبيق أكثر قدرة على التوسع والتكامل مع متطلبات التجارة الإلكترونية المعاصرة.
المراجع:
-
Laravel 5.5 Documentation — https://laravel.com/docs/5.5
-
Session Management in Laravel — https://laravel.com/docs/5.5/session

