/
أفضل طريقة لتنظيم الأكواد في Laravel باستخدام Service Classes
أفضل طريقة لتنظيم الأكواد في Laravel باستخدام Service Classes

أفضل طريقة لتنظيم الأكواد في Laravel باستخدام Service Classes

تم نشره
Apr 21, 2025
كتب بواصة
معاذ الغرابلي
0
تعليقات

مقدمة

في مشاريع Laravel الكبيرة أو المتوسطة، يزداد تعقيد الكود داخل الـ Controllers، مما يؤدي إلى صعوبة القراءة والصيانة والاختبار.
من هنا تظهر أهمية استخدام Service Classes كطريقة فعالة لتنظيم الأكواد وفصل المهام.

في هذه المقالة، سنشرح مفهوم Service Classes، متى تستخدمها، وكيف تبنيها بطريقة احترافية، مدعومة بأمثلة حقيقية وأفضل الممارسات.


ما هي Service Class؟

هي كلاس مخصصة تحتوي على منطق أعمال (Business Logic) محدد، تُستخدم من قِبل الـ Controllers أو الـ Jobs أو غيرها.

✅ الهدف منها:

  • تقليل الكود داخل الـ Controllers.
  • تطبيق مبدأ المسؤولية الواحدة (Single Responsibility Principle).
  • تسهيل الاختبار والتعديل.

متى تستخدم Service Classes؟

الحالة هل نستخدم Service؟
الكود يتجاوز 30-40 سطر داخل controller نعم
هناك أكثر من عملية متكررة على نفس النموذج نعم
الكود بسيط ولا يتكرر لا

كيف تنشئ Service Class في Laravel؟

1. إنشاء مجلد Services داخل app/

mkdir app/Services

2. إنشاء الكلاس

namespace App\Services;

use App\Models\User;

class UserService
{
    public function create(array $data): User
    {
        return User::create($data);
    }

    public function update(User $user, array $data): bool
    {
        return $user->update($data);
    }
}

استخدام Service داخل Controller

use App\Services\UserService;

class UserController extends Controller
{
    public function store(Request $request, UserService $userService)
    {
        $user = $userService->create($request->validated());
        return redirect()->route('users.index');
    }
}

ماذا لو احتاجت الـ Service إلى Dependency؟

Laravel يدعم الـ Dependency Injection داخل Service Class مثل أي Controller.

class OrderService
{
    public function __construct(protected PaymentGateway $gateway)
    {
    }

    public function process($order)
    {
        return $this->gateway->charge($order->amount);
    }
}

استخدام الـ Service داخل Job

class ProcessOrderJob implements ShouldQueue
{
    public function __construct(protected Order $order) {}

    public function handle(OrderService $orderService)
    {
        $orderService->process($this->order);
    }
}

مقارنة قبل وبعد استخدام Service

❌ قبل (في Controller)

public function store(Request $request)
{
    $user = new User();
    $user->name = $request->name;
    $user->email = $request->email;
    $user->save();

    Mail::to($user->email)->send(new WelcomeMail($user));
}

✅ بعد (مع Service)

public function store(Request $request, UserService $userService)
{
    $userService->register($request->validated());
}

داخل الـ Service:

public function register(array $data)
{
    $user = User::create($data);
    Mail::to($user->email)->send(new WelcomeMail($user));
}

Service vs Trait vs Helper

الأسلوب متى نستخدمه؟
Service منطق أعمال كبير أو متكرر
Trait مشاركة وظائف بسيطة داخل أكثر من كلاس
Helper دوال بسيطة أو ثابتة الاستخدام

نصائح عامة

  1. اجعل كل Service متخصصة بمهمة واحدة فقط.
  2. لا تربط الـ Service مباشرة بالـ Controller فقط، استخدمها في Jobs وCommands أيضًا.
  3. اسم الكلاس يجب أن يعكس وظيفته: InvoiceService, PaymentService.

الخلاصة

Service Classes في Laravel هي أداة قوية لتنظيم الكود ورفع جودة المشروع.
تساعدك في كتابة كود نظيف، قابل للصيانة، وقابل للاختبار بسهولة.

هل تستخدم Service Classes في مشاريعك؟ شاركنا تجربتك!


يرجى تسجيل الدخول لكتابة تعليق.

0 تعليقات