البرمجة

استخدام @inject في Laravel

استخدام @inject لحقن مزود الخدمة (Service Provider) في قالب Blade في Laravel

في عالم تطوير تطبيقات الويب باستخدام إطار Laravel، تُعد قوالب Blade من الأدوات الأساسية التي تسهل عملية عرض البيانات بطريقة منظمة ومرنة. ومن بين التقنيات الهامة التي يوفرها Laravel في قوالب Blade هو توظيف التبعية Injection، والتي تمكن المطور من حقن خدمات ومزودي خدمة (Service Providers) مباشرة في القالب دون الحاجة إلى التداخل في منطق التحكم Controllers بشكل مباشر. يعد تعبير @inject في Blade من أبرز الأدوات التي تحقق هذا الهدف بفعالية عالية.


تعريف مفهوم حقن التبعية (Dependency Injection) في Laravel

حقن التبعية هو نمط تصميم برمجي يهدف إلى فصل مكونات البرنامج عن بعضها، عبر تمرير تبعيات الكائنات (dependencies) إلى الكائن الذي يحتاجها بدلاً من إنشائها داخله. في Laravel، يُستخدم هذا النمط بشكل واسع في التحكم بالتدفق وحقن الخدمات المختلفة مثل قواعد البيانات، البريد الإلكتروني، الجلسات، وغيرها.


ما هو @inject في Blade؟

@inject هو توجيه Blade يسمح لك بحقن كائن من نوع خدمة معينة داخل قالب Blade مباشرة. ببساطة، يربط هذا التوجيه متغيرًا في القالب بكائن معين من مزود الخدمة في حاوية الخدمات الخاصة بـ Laravel، مما يمنحك القدرة على استخدام الوظائف والبيانات التي يقدمها هذا الكائن في العرض دون الحاجة لتمريرها من الـ Controller.

الشكل العام لاستخدام @inject في قالب Blade هو:

blade
@inject('variableName', 'ServiceClassName')
  • variableName: اسم المتغير الذي سيستخدم داخل القالب لتمثيل الكائن.

  • ServiceClassName: الاسم الكامل أو المعرف (alias) لمزود الخدمة الذي سيتم حقنه.


أهمية استخدام @inject في قوالب Blade

  • تبسيط الكود: يسمح @inject بالتعامل مع الخدمات بشكل مباشر داخل القالب، ما يقلل من الحاجة إلى تمرير البيانات عبر الـ Controller أو استخدام طرق متعددة لإدخال البيانات.

  • تقليل التكرار: في حال كانت خدمة معينة تستخدم بكثرة في عدة قوالب، يمكن حقنها مباشرة دون الحاجة إلى إعادة تعريفها في كل مرة داخل الـ Controller.

  • الفصل بين المنطق والعرض: يتيح لك @inject المحافظة على منطق العرض منفصلًا عن منطق التحكم، لكنه في الوقت ذاته يسمح بالوصول المباشر للخدمات الضرورية داخل القالب.

  • مرونة أكثر: خصوصًا في القوالب التي تتطلب استدعاء خدمات معقدة مثل خدمات الدفع، الترجمة، أو الجلب المباشر للبيانات من مزودات خدمة.


أمثلة عملية على استخدام @inject

1. حقن خدمة لإحضار إعدادات التطبيق

في تطبيق Laravel، عادةً ما يتم تخزين بعض الإعدادات في قاعدة البيانات عبر مزود خدمة مخصص مثل SettingsService. بدلاً من تمرير إعدادات التطبيق من الـ Controller إلى القالب، يمكننا حقن الخدمة مباشرة داخل قالب Blade:

blade
@inject('settings', 'App\Services\SettingsService')

عنوان الموقع: {{ $settings->get('site_title') }}

وصف الموقع: {{ $settings->get('site_description') }}

في هذا المثال، SettingsService يحتوي على دالة get تسترجع الإعدادات حسب المفتاح.


2. حقن خدمة للتحكم في المستخدم الحالي

يمكن أيضًا حقن مزود خدمة خاص بإدارة المستخدمين أو الأدوار في القالب:

blade
@inject('authService', 'App\Services\AuthService') @if($authService->checkRole('admin'))

مرحبًا بك، مسؤول الموقع.

@endif

يتيح هذا التوجيه إمكانية التعامل مع صلاحيات المستخدم دون الحاجة إلى تمريرها من الـ Controller.


كيفية إعداد مزود خدمة (Service Provider) للاستفادة منه مع @inject

لكي نتمكن من استخدام خدمة معينة في @inject، يجب أولاً تسجيل هذه الخدمة في حاوية الخدمة الخاصة بـ Laravel. يتم ذلك عادة من خلال:

  • إنشاء الخدمة: كتابة كلاس خاص بالخدمة في مجلد app/Services أو أي مجلد تنظيمي آخر.

  • تسجيل الخدمة في Service Container: وذلك عبر تسجيلها داخل AppServiceProvider أو أي مزود خدمة مخصص عبر دالة register().

مثال لتسجيل خدمة في مزود خدمة:

php
namespace App\Providers; use Illuminate\Support\ServiceProvider; use App\Services\SettingsService; class AppServiceProvider extends ServiceProvider { public function register() { $this->app->singleton(SettingsService::class, function ($app) { return new SettingsService(); }); } }

بعد تسجيل الخدمة في حاوية الخدمات، يمكن استدعاؤها بسهولة باستخدام اسم الكلاس في @inject.


مقارنة بين تمرير البيانات التقليدي وحقن الخدمة باستخدام @inject

الجانب التمرير التقليدي (من Controller) الحقن باستخدام @inject
مكان تمرير البيانات داخل الـ Controller قبل عرض القالب مباشرة داخل قالب Blade
إعادة استخدام الخدمة يحتاج تكرار في كل Controller يستخدم الخدمة حقن مباشر في أي قالب دون تكرار
تعقيد الكود قد يزيد مع زيادة الخدمات والبيانات الممررة يبسط الكود في الـ Controller
إمكانية الوصول للبيانات محدودة للمتغيرات الممررة فقط إمكانية الوصول لكامل وظائف مزود الخدمة
الفصل بين المنطق والعرض جيد عند تقسيم المنطق في الـ Controller قد يخلط بعض المنطق مع العرض إذا أُسيء استخدامه

الحالات التي يُنصح فيها باستخدام @inject

  • عند الحاجة لاستخدام وظائف خدمة معينة بكثرة في القوالب مثل جلب الإعدادات، المعلومات الثابتة، أو عمليات معينة غير معقدة.

  • عند الرغبة في تقليل تمرير المتغيرات من الـ Controller خاصة في المشاريع الكبيرة ذات القوالب المتعددة.

  • حين يكون المحتوى أو العرض بحاجة إلى التفاعل المباشر مع الخدمات مثل تحديد صلاحيات أو جلب بيانات مرتبطة بالمستخدم.

  • في مشاريع تستخدم مزودات خدمة تقدم خدمات متنوعة تستدعي مرونة في الاستخدام داخل العرض.


ملاحظات وأفضل الممارسات عند استخدام @inject

  • يجب ألا يحتوي قالب Blade على منطق برمجي معقد أو عمليات حسابية كبيرة، فالهدف من Blade هو العرض فقط. عند استخدام @inject لا يجب تحميل قالب العرض بعمليات منطقية كثيرة بل الاكتفاء باستخدام الخدمات لجلب البيانات أو القيم.

  • من الأفضل استخدام @inject لخدمات خفيفة الوزن التي لا تؤثر سلباً على أداء التطبيق عند استدعائها في القالب.

  • التأكد من تسجيل الخدمات بشكل صحيح في مزود الخدمة حتى لا تحدث أخطاء أثناء الحقن.

  • مراعاة فصل المسؤوليات بحيث لا تستخدم @inject لحقن خدمات تحتوي على عمليات تتعلق بأعمال التحكم أو التعامل مع البيانات المعقدة، بل يتم التعامل معها في الطبقات المناسبة مثل Controllers أو Services.


إضافة متغيرات ديناميكية من الخدمات داخل قوالب Blade

من إحدى الاستخدامات المهمة لـ @inject هو إمكانية دمج بيانات ديناميكية مباشرة في القالب من خلال خدمات متخصصة، مما يسهل تحديث البيانات دون الحاجة إلى تعديل الـ Controller أو إعادة كتابته.

مثال على ذلك، إذا كان لديك خدمة NotificationService تعرض عدد الإشعارات الجديدة:

blade
@inject('notificationService', 'App\Services\NotificationService') لديك {{ $notificationService->unreadCount() }} إشعار جديد

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


مقارنة مع طرق أخرى للحصول على الخدمات في Blade

بديل آخر لـ @inject هو تمرير البيانات من الـ Controller، أو استخدام Facades، أو عمل Bindings في View Composers، وكل طريقة لها مميزاتها وعيوبها.

  • تمرير البيانات من الـ Controller: أكثر وضوحاً ومنظماً لكنه يضيف عبء تمثيل البيانات عبر المتحكمات.

  • استخدام Facades: يسهل استدعاء الخدمات بشكل ثابت لكنه يقلل من قابلية اختبار الكود ويفقد بعض ميزات الـ Dependency Injection.

  • View Composers: تعطي تحكم أكبر في تنظيم البيانات لكل View لكنها تتطلب إعداداً مبدئياً أكثر.

@inject يقع في نقطة وسط بين التمرير المباشر والخدمات المعقدة، ويتميز بالسهولة والمرونة في القوالب.


خلاصة

@inject هو توجيه قوي وفعال ضمن أدوات Laravel Blade يتيح حقن خدمات مزودي الخدمة بشكل مباشر داخل قوالب العرض. يساهم هذا التوجيه في تسهيل استدعاء الخدمات، تقليل التكرار، وتنظيم الكود بطريقة أكثر مرونة. كما يسمح بالوصول السريع للبيانات والوظائف دون اللجوء إلى التداخل مع منطق الـ Controller.

من خلال تسجيل الخدمات بشكل صحيح داخل حاوية Laravel، يمكن استدعاؤها بسهولة في Blade عبر @inject، ما يعزز من بنية التطبيقات البرمجية ويجعلها أكثر قابلية للصيانة والتوسع.


مراجع ومصادر