مقدمة إلى Service Container في Laravel

Amine
30/08/2024

المقدمة

حاوية الخدمات في Laravel هي أداة قوية تستخدم لحل الاعتماديات (Dependency Injection) وإدارة الكائنات (Object Management) داخل التطبيق. هي المسؤولة عن ربط الكائنات وتقديمها عند الحاجة، مما يساعد على تحسين تنظيم الكود وزيادة مرونته. باستخدام حاوية الخدمات، يمكنك بسهولة إنشاء الكائنات، ربط واجهات مع تنفيذاتها، وتنفيذ اعتماديات تلقائية لكل من المتحكمات (Controllers)، والوحدات (Components)، وغيرها من أجزاء التطبيق.

الخطوة 1: فهم حاوية الخدمات في Laravel

حاوية الخدمات هي المكان الذي يقوم فيه Laravel بتسجيل كل الخدمات التي يحتاجها التطبيق، مثل خدمات قواعد البيانات، البريد الإلكتروني، وغيرها. يمكن استخدام حاوية الخدمات لإنشاء الكائنات تلقائيًا، حقن التبعية، وحل الاعتماديات.

الخطوة 2: تسجيل الخدمات في حاوية الخدمات

لتسجيل خدمة أو كائن داخل حاوية الخدمات، يمكنك استخدام الدالة bind أو singleton في ملف AppServiceProvider.php أو أي موفر خدمة آخر. لنقم بتسجيل كائن بسيط داخل الحاوية:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\MyService;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        // تسجيل خدمة باستخدام bind
        $this->app->bind('App\Services\MyService', function ($app) {
            return new MyService();
        });
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

في هذا المثال، نقوم بتسجيل كائن MyService في الحاوية باستخدام دالة bind. عند استخدام bind، سيتم إنشاء كائن جديد في كل مرة يتم فيها طلب الخدمة من الحاوية.

الخطوة 3: استخدام الخدمات المسجلة في حاوية الخدمات

لاستخدام الخدمة المسجلة في الحاوية، يمكنك استخدام دالة resolve أو app للحصول على كائن الخدمة:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Services\MyService;

class MyController extends Controller
{
    protected $myService;

    public function __construct(MyService $myService)
    {
        $this->myService = $myService;
    }

    public function index()
    {
        // استخدام الخدمة
        return $this->myService->performAction();
    }
}

في هذا المثال، نقوم بحقن كائن MyService تلقائيًا في المتحكم عبر التبعية في المُنشئ (Constructor Injection). يقوم Laravel تلقائيًا بحل الاعتماديات وتوفير الكائن المطلوب باستخدام حاوية الخدمات.

النتيجة عند التنفيذ: عند الوصول إلى دالة index في MyController، سيتم تنفيذ الدالة performAction من MyService، وستظهر النتيجة في المتصفح أو كاستجابة HTTP:

MyService Action Executed!

الخطوة 4: استخدام الـ Singleton في حاوية الخدمات

يمكنك أيضًا تسجيل خدمة كـ singleton في حاوية الخدمات، مما يعني أن الكائن سيتم إنشاؤه مرة واحدة فقط واستخدامه في كل مرة يتم فيها طلب الخدمة من الحاوية:

$this->app->singleton('App\Services\MyService', function ($app) {
    return new MyService();
});

عند استخدام singleton، يتم إعادة استخدام نفس الكائن في كل مرة، مما يقلل من تكلفة إنشاء الكائنات ويحسن الأداء.

النتيجة عند التنفيذ: عند طلب MyService عدة مرات داخل نفس الطلب HTTP، سيظهر نفس الكائن (نفس المرجع في الذاكرة)، مما يوفر الأداء والموارد:

Using the same instance of MyService

الخطوة 5: استخدام واجهات مع حاوية الخدمات

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

$this->app->bind('App\Contracts\ServiceInterface', 'App\Services\MyService');

عند القيام بذلك، يمكنك طلب الواجهة في أي مكان داخل التطبيق وسيقوم Laravel بحقن التنفيذ المناسب:

<?php

namespace App\Http\Controllers;

use App\Contracts\ServiceInterface;

class MyController extends Controller
{
    protected $service;

    public function __construct(ServiceInterface $service)
    {
        $this->service = $service;
    }

    public function index()
    {
        return $this->service->performAction();
    }
}

النتيجة عند التنفيذ: يتم حقن الكائن الذي ينفذ ServiceInterface تلقائيًا في MyController. عند تنفيذ دالة index، سيتم استخدام الخدمة المرتبطة وتنفيذ performAction:

Interface implementation action performed!

الخطوة 6: استخدام Facades للوصول إلى حاوية الخدمات

يمكنك أيضًا استخدام Facades للوصول إلى حاوية الخدمات واستخدامها. على سبيل المثال، للوصول إلى الكائن المسجل في الحاوية، يمكنك استخدام:

use App\Services\MyService;
$service = app(MyService::class);
$service->performAction();

النتيجة عند التنفيذ: عند استخدام app() للوصول إلى خدمة، سيتم الحصول على الخدمة المسجلة من حاوية الخدمات، وسيتم تنفيذ performAction:

Service retrieved and action executed!

الخاتمة

حاوية الخدمات في Laravel هي أداة قوية لإدارة الاعتماديات وتسهيل بنية التطبيق. من خلال استخدام حاوية الخدمات، يمكنك تحسين تنظيم الكود وزيادة مرونته، مما يسهل صيانة التطبيق وتطويره في المستقبل. استمر في استكشاف ميزات Laravel لتحسين تطبيقاتك وتعزيز أدائها.

التعليقات

اترك تعليقاً