اذهب إلى المحتوى
  • 0

ما هو service provider في لارافل و ما هي فائدته بشكل مبسط

حيدر رزاق

السؤال

Recommended Posts

  • 0

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

وستجد أن جميع الـ service providers التي تقوم بإنشائها أصبحت في مسار bootstrap/providers.php

عامًة الـ Service Provider هو كلاس في Laravel لتسجيل الخدمات والتبعيات dependencies في حاوية الخدمة Service Container، أي فكر به على أنه مكان لتهيئة مختلف أجزاء التطبيق وتسجيل جميع الخدمات التي يحتاجها التطبيق قبل بدء التشغيل.

أي الـ Service Providers هي مثل مخططات البناء blueprints التي تحدد كيفية بناء وتوصيل مكونات المنزل المختلفة، مثل الكهرباء، والسباكة، والتدفئة، وحاوية الخدمات Service Container هي مثل صندوق الأدوات الذي يحتوي على جميع الأدوات والمواد اللازمة لبناء المنزل.

والروابط Bindings هي مثل التعليمات التي تخبرك بأي أداة تستخدمها لبناء كل مكون.

الفائدة من ذلك هو جعل الكود أكثر تنظيماً حيث يتم فصل تسجيل الخدمات وإعدادات التهيئة في أماكن مخصصة، وتستطيع بسهولة إضافة أو تعديل الخدمات التي يحتاجها التطبيق وإعادة استخدام نفس Service Provider في تطبيقات مختلفة.

لإنشاء ذلك ستحتاج إلى تنفيذ الأمر التالي:

php artisan make:provider testServiceProvider

تستطيع كتابة أي اسم تريده بدلاً من testServiceProvider.

بعد ذلك ستجد ميثود  register وبها عليك تسجيل الروابط bindings في حاوية الخدمات Service Container، ويجب عليك تجنب استدعاء أي دوال أخرى من إطار العمل داخل register، لأنها قد لا تكون متاحة بعد.

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

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

وعليكم السلام ورحمة الله وبركاته .

إن Service Providers (مقدمو الخدمات) هي العمود الفقري لتطبيق Laravel وهو المركز الرئيسى لكامل عمليات تمهيد التطبيق (bootstrapping) , حيث يعمل كأداة لتسجيل وتكوين الخدمات التي يعتمد عليها التطبيق كاملا . يتم استخدام Service Providers لتحميل خدمات التطبيق مثل الربط بين الواجهات و تسجيل روابط حاوية الخدمات (ٍservice container) و مستمعي الأحداث (event listeners) و البرامج الوسيطة (middlewares) و حتى المسارات (route binding) .

وإن جميع إصدارات لارافيل لها نفس إستخدامات Service Providers ونفس الخصائص والإختلاف فقط الآن في إصدار 11 حيث بدلا من أن يتم تسجيل ال Service Providers في config/app.php أصبح الآن يتم تسجيله في bootstrap/providers.php .

أما طريقة إنشاء ال bootstrap/providers.php كما هي . والآن لنقم معا بإنشاء Service Providers.

لإنشاء Service Provider نقوم بتنفيذ الأمر التالي :

php artisan make:provider CustomServiceProvider

وسيتم إنشاء ملف جديد بإسم ال  Service Provider الذي قمت بكتابته في app\Providers وسيتم تسجيله تلقائيا بداخل bootstrap/providers.php .

الآن هذا هو محتوي الملف بعد إنشاءه :

namespace App\Providers;

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

class CustomServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        // تسجيل الخدمة في حاوية الخدمة
        $this->app->singleton(CustomService::class, function ($app) {
			// CustomService هنا سيتم تنفيذ الكود التالي عند محاولة إنشاء كائن من 
            return new CustomService();
        });
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // منطق يحتاج إلى التنفيذ بعد تسجيل الخدمات
    }
}

الآن بعد إنشاء ال service provider لنري كيف يتم إستخدامه . 

لنفترض أن لدينا controller يسمى test مثلا :

use App\Services\CustomService;

class TestController extends Controller
{
    protected $customService;

    public function __construct(CustomService $customService)
    {
        $this->customService = $customService;
    }

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

لاحظ هنا في TestController قمنا بإنشاء دالة بانية __construct وهذا ال controller يعتمد على CustomService الذى قمنا بإنشاء ال service providers لها وبهذا عند إستدعاء هذا ال controller أو قام أى route بالإشارة إليه سيتم تنفيذ الدالة البانية وبداخل الدالة البانية ننشأ كائن من CustomService وبهذا سيتم تنفيذ الكود الذى قمنا بكتابته بداخل service provider في الدالة register .

لنري معا أين الإستفادة منه : من المؤكد أنك إستخدمت route binding في لارافيل :

use App\Http\Controllers\UserController;
use App\Models\User;

// Route definition...
Route::get('/users/{user}', [UserController::class, 'show']);

// Controller method definition...
public function show(User $user)
{
    return view('user.profile', ['user' => $user]);
}

لاحظ في الكود السابق كيف قمنا بتمرير المعامل User إلى الدالة show ولذلك عند الذهاب إلى المسار /users/5 لارافيل تلقائيا سيقوم بوضع المستخدم صاحب ال id رقم 5 بداخل المتغير user$ . كيف قام بهذا ؟ وبدون حتي أن نرسل إستعلام إلى قاعدة البيانات لإحضار المستخدم .

هذه هي قوة ال Service providers مع Service Container وهما من أقوى الخصائص في لارافيل ففي هذا المثال بسيط قد قام بتوفير علينا إرسال إستعلام إلى قاعدة البيانات وغيره .

ويمكنك قراءة المزيد عن Service providers على موقع موسوعةحسوب على الرابط التالي .

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

أطر العمل الشهيرة في PHP والتي من بينها لارافيل تعتمد على ما يُسمى بحاوية الخدمات (Service Container) وهي عبارة عن حاوية يتم ملؤها بكافة الإعتماديات والتبعيات التي يحتاجها إطار العمل للإقلاع وتتم هذه العملية أثناء التمهيد (Bootstrapping)، تعتمد لارافيل كثيراً على مزودي الخدمات (Service Providers) لتحميل الأصناف و الكائنات وغيرها من إعتماديات، وأثناء التنفيذ إذا ما احتاج صنف معين إلى شيء ما يتم جلبه من تلك الحاوية إن كان موجود وإذا لم يكن كذلك يتم إنشاؤه و الإحتفاظ به في الحاوية لجلبه عند الطلب مرة أخرى.

في الرابط التالي:  DefaultProviders ستجد كل مزودي الخدمات الإفتراضية التي يستعملها إطار العمل، كل مزود خدمة به تابع register يقوم بتسجيل الخدمة التي يقدمها في حاوية الخدمات، أثناء عملية التمهيد يتم المرور عليها كلها وتنفيذ التابع register لتسجيل تلك الإعتماديات. بعد تسجيل مزود الخدمة يتم أيضًا إستدعاء التابع boot

يُمكنك الإطلاع على المقال التالي للمزيد من المعلومات:

مُعظم الحزم الشهيرة بها مزود خدمة يتم تسجيله بعد تثبيت الحزمة و هنا مثال عن  FortifyServiceProvider ، بإمكانك إنشاء مزودو خدمة خاصين بتطبيقك الذي تبنيه، كل ما عليك هو تسجيلهم في الملف providers.php الموجود في مجلد bootstrap أو إستخدام AppServiceProvider الموجود بشكل إفتراضي

المفهوم نفسه لم يتغير سواء في لارافيل 11 أو الإصدارات التي قبله، ما تغير هو فقط مكان تسجيل مزودي الخدمات الخاصة بالحزم أو تلك التي تُنشؤها بنفسك، سابقاً كان في ملف app.php بمجلد config و الآن أصبح يتم من خلال الملف providers.php الموجود في مجلد bootstrap. بالنسبة للحزم التي تقوم بتثبيتها يُفترض أن عملية التسجيل ستتم بشكل تلقائي أما إذا أنشأت مزود خدمة بنفسك فستسجله بنفسك وذلك فقط بإضافته إلى المصفوفة في الملف.

ستجد في المساهمة التالية مثال عن الإستخدام لإنشاء نظام صلاحيات و أدوار:

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

فالاول يجب فهم الService Container يمكن أن يكون Service Container معقد بعض الشيء، 

Service Container في Laravel هو أداة قوية لإدارة التبعية (Dependency Injection) وتحديد مكونات التطبيق. يُعتبر Service Container قلب Laravel حيث يساعد في ربط المكونات المختلفة معًا بشكل مرن وسهل.

مفهوم التبعية (Dependency) عندما يعتمد كائن ما على كائن آخر لكي يعمل، يُقال أن لديه "تبعية". على سبيل المثال، لنفترض أن لدينا كائنًا من نوع RegisterController والذي يعتمد على كائن من نوع RegisterService. هنا، RegisterController يعتمد على RegisterService ليعمل بشكل صحيح.

Service Container يعمل كصندوق أسود، يتم فيه تسجيل جميع الخدمات التي يحتاجها التطبيق، وعند الحاجة إلى أي خدمة، يتم استدعاؤها من خلال هذا الصندوق بطريقة بسيطة ومنظمة.

كيفية استخدام Service Container:
1. تسجيل الخدمات (Binding):
يمكن تسجيل الخدمات في Service Container باستخدام طرق مثل bind و singleton. يتم تسجيل أغلب الخدمات في ال Service Provider in register() function
داخل ال service provider يمكننا الوصول إلى ال Service Container عن طريق هذه الخاصية
$this->app

الفرق بين bind و singleton:

  • bind: يتم استخدام bind لتسجيل خدمة يتم إنشاؤها في كل مرة يتم فيها طلبها من الـ Service Container. بمعنى آخر، يتم إنشاء كائن جديد في كل مرة تستدعي فيها الخدمة.
  • singleton: يتم استخدام singleton لتسجيل خدمة يتم إنشاؤها مرة واحدة فقط عند أول طلب، وتُعاد نفس النسخة في كل مرة يتم فيها طلبها بعد ذلك. هذا يضمن أن نفس الكائن يُستخدم في جميع أنحاء التطبيق.

2. استدعاء الخدمات (Resolving):
يوجد طريقتين لإستدعاء الخدمات التي تم تسجيلها

الاستدعاء التلقائي:
لحسن الحظ، العديد من الكلاسات التي سيتم كتابتها عند بناء تطبيق Laravel تستقبل تلقائيًا تبعياتها عبر الـ Container، بما في ذلك:
Controllers - Event Listeners - Middleware

الاستدعاء اليدوي:
يمكنك أيضا استدعاء الخدمات يدويا باستخدام طريقة make من الـ Service Container

فوائد استخدام Service Container:

  • إدارة التبعيات بفعالية: يساعد Service Container في إدارة التبعيات بين المكونات المختلفة في التطبيق بطريقة مركزية ومرنة.
  •  
  • سهولة الاختبار: من خلال حقن التبعيات، يصبح من السهل اختبار المكونات بشكل منعزل باستخدام أدوات الاختبار (Mocking).
  •  
  • تنظيم الكود: يساهم Service Container في تنظيم الكود بشكل أفضل من خلال تجميع التسجيلات في مكان واحد.

فلنرجع لفهم الService Provider فهو أساس عملية التحميل في Laravel. فهو المسؤول عن ربط جميع الخدمات الرئيسية في التطبيق، بما في ذلك الخدمات التي يحتاجها التطبيق للعمل بشكل صحيح.

تستخدم Service Providers لتهيئة تطبيق Laravel وإعداده. تقريبا كل خدمة في Laravel يتم تهيئتها عبر Service Providers، سواء كانت خدمة داخلية أو خدمة يتم استخدامها من حزم خارجية.

كل Service Provider يسجل في الملف config/app.php داخل المصفوفة providers.

لإنشاء Service Provider: يمكنك إنشاء Service Provider جديد باستخدام الأمر artisan التالي:

php artisan make:provider AdminServiceProvider

سينتج عن هذا إنشاء ملف جديد داخل مجلد app/Providers.

بعد إنشاء Service Provider، يجب تسجيله داخل الملف config/app.php في المصفوفة providers.

لإعداد Service Provider يتضمن كل Service Provider two function: register and boot.

  • register: يتم استخدام هذه function لتسجيل الخدمات في الحاوية (Container). هنا يمكن ربط الكلاسات عن طريق dependency injection كما قمت بشرحه في البوست السابق.
  • boot: يتم استدعاء هذه function بعد تنفيذ كل ال register() function لجميع ال service providers. يمكننا استخدامها لتنفيذ أي إجراءات تتطلب الخدمات المسجلة، مثل تسجيل routes or command.

أهمية استخدام boot:
في Service Provider يتم استدعاؤها بعد تسجيل جميع الخدمات، مما يعني أنه يصبح لدينا وصولا إلى جميع الخدمات الأخرى التي تم تسجيلها بواسطة داخل ال register function. هذا مفيد بشكل خاص عندما تحتاج إلى تسجيل View Composers

أهمية Service Providers:

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

مقدمو الخدمات (Service Providers) في Laravel

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...