البرمجة

إنشاء سلة مشتريات في Laravel

إنشاء سلة مشتريات في 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

bash
composer create-project --prefer-dist laravel/laravel laravel-cart "5.5.*"

إنشاء نموذج البيانات للمنتجات

لإنشاء سلة مشتريات، نحتاج أولاً إلى نموذج بيانات يمثل المنتجات.

bash
php artisan make:model Product -m

ثم في ملف التهجير database/migrations/xxxx_create_products_table.php:

php
Schema::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(); });

نفذ الأمر:

bash
php artisan migrate

إنشاء نظام سلة المشتريات باستخدام Session

بما أن Laravel يوفر دعمًا قويًا للجلسات، يمكننا استخدام الجلسة لتخزين بيانات سلة المشتريات مؤقتًا، مع إمكانية لاحقة لتخزينها في قاعدة البيانات.

إنشاء CartController

bash
php artisan make:controller CartController

منطق الإضافة إلى السلة

php
public 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', 'تمت إضافة المنتج إلى السلة بنجاح'); }

عرض السلة

php
public function viewCart() { $cart = session()->get('cart'); return view('cart.index', compact('cart')); }

حذف عنصر من السلة

php
public function removeFromCart($id) { $cart = session()->get('cart'); if (isset($cart[$id])) { unset($cart[$id]); session()->put('cart', $cart); } return redirect()->back()->with('success', 'تم حذف المنتج من السلة'); }

تحديث الكمية

php
public 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)

php
Route::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')

سلة المشتريات

@if(session('cart')) @php $total = 0 @endphp @foreach(session('cart') as $id => $details) @php $total += $details['price'] * $details['quantity'] @endphp @endforeach
المنتج الكمية السعر المجموع الإجراء
{{ $details['name'] }}
@csrf @method('PATCH')
{{ $details['price'] }} {{ $details['price'] * $details['quantity'] }}
@csrf @method('DELETE')

الإجمالي: {{ $total }}

@else

السلة فارغة

@endif
@endsection

الجدول الفني لتخزين السلة

الحقل النوع الوصف
product_id INT معرف المنتج
name VARCHAR اسم المنتج
quantity INT عدد القطع في السلة
price DECIMAL(8,2) سعر القطعة الواحدة
image VARCHAR رابط الصورة
session_id VARCHAR معرف الجلسة (عند استخدام قاعدة بيانات)

تحسينات متقدمة

حماية من التلاعب في الأسعار

يجب عدم الاعتماد على بيانات السعر القادمة من الواجهة الأمامية، بل يجب جلب السعر من قاعدة البيانات دائمًا.

حفظ السلة للمستخدم المسجل

عند تسجيل الدخول، يمكن تخزين السلة في قاعدة البيانات لربطها بحساب المستخدم.

الدمج مع بوابة دفع إلكتروني

بعد التأكد من محتويات السلة، يمكن نقل المستخدم إلى صفحة الدفع وإرسال إجمالي الفاتورة مع تفاصيل المنتجات.


الأداء والأمان

  • استخدام Middleware لتقييد الوصول للسلة.

  • تنظيف الجلسات المنتهية تلقائيًا.

  • تخزين السلة في قاعدة بيانات في حال كانت الجلسة غير كافية.

  • تأكيد على تحديث الكميات بما يتماشى مع المخزون الفعلي.


توسيع سلة المشتريات

بعد الانتهاء من الوظائف الأساسية، يمكن توسيع النظام بإضافة:

  • تطبيق كوبونات الخصم.

  • احتساب الضرائب حسب الموقع الجغرافي.

  • دعم خيارات الشحن.

  • إدارة سلال متعددة.


خاتمة تقنية

إن بناء سلة مشتريات باستخدام Laravel 5 يوفر تحكمًا شاملاً في تجربة المستخدم وإدارة الطلبات بشكل احترافي. بفضل بنية Laravel المرنة، يمكن دمج هذه السلة بسهولة مع الأنظمة الأخرى مثل الدفع، الفوترة، وتتبّع الشحن. كما يُعد استخدام الجلسات بداية ممتازة للمشاريع الصغيرة، ويمكن التوسع تدريجياً نحو حفظ دائم باستخدام قاعدة البيانات. عند اعتماد هذا النهج، يصبح التطبيق أكثر قدرة على التوسع والتكامل مع متطلبات التجارة الإلكترونية المعاصرة.


المراجع: