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


محمد أحمد العيل

رأينا في درس كيف تنشئ مزود خدمة Service provider في Laravel طريقة عمل مزوّدات الخدمة والآليّة التي تتيح بها مرونة أكبر في التعامل مع الأصناف في Laravel.

سنرى في هذا الدّرس كيفيّة الاستفادة من تعليمة inject@ لإعادة استخدام مزوّد خدمة في قالب Blade.

laravel-inject-service-provider-blade.png

استخدمنا في الدرس السابق مزوّد خدمة داخل متحكّم على النحو التالي:

public function index(RocketShipContract $rocketship)
{
        $boom = $rocketship->blastOff();

        return view('demo.index', compact('boom'));
}

سنفترض أن لدينا ثلاثة عروض view1 وview2 إضافة للعرض index (كلّها في نفس المجلّد):

العرض view1:

<!--  تعليمات خاصّة بالعرض view1 -->
@include('demo.index')
<!--  تعليمات خاصّة بالعرض view1 -->

العرض view2:

<!--  تعليمات خاصّة بالعرض view2 -->
@include('demo.index')
<!--  تعليمات خاصّة بالعرض view2 -->

العرض index:

@extends('layouts.master')
@section('content')
{{ $boom }}
@endsection

نلاحظ أن العرض index يُضمَّن في العرضيْن view1 وview2. سنفترض أيضا أن لدينا الدالتين التاليتين في المتحكّم:

public function function1(RocketShipContract $rocketship)
{
        $boom = $rocketship->blastOff();

        return view('demo.view1', compact('boom'));
}

public function function2(RocketShipContract $rocketship)
{
        $boom = $rocketship->blastOff();

        return view('demo.view2', compact('boom'));
}

تعمل الطريقة أعلاه دون مشكل؛ ولكن ماذا لو أضفنا مسارا ثالثا يستدعي عرضا آخر يُضمِّن العرض index؟

إذا اتبعنا نفس الطريقة فسنضيف دالة جديدة إلى المتحكّم كالتالي:

public function function3(RocketShipContract $rocketship)
{
        $boom = $rocketship->blastOff();

        return view('demo.view3', compact('boom'));
}

يمكن أن نلاحظ بوضوح وجود الكثير من التكرار لاستخدام الصّنف RocketShipContract.

لتلافي هذا الوضع يعرّف Laravel حقن الخدمة Service injection.

يقوم المبدأ على استخدام التعليمة inject@ التي تتيح استدعاء صنف مّا مباشرة في العرض. بتطبيق هذا المبدأ في الحالة أعلاه نعدّل العرض index ليصبح كالتالي:

@inject('boom', 'App\Helpers\Contracts\RocketShipContract')

@extends('layouts.master')

@section('content')

    {{ $boom->blastOff() }}

@endsection

تأخذ التعليمة inject@ معطييْن؛ الأول (boom في المثال) اسم المتغيّر الذي سنحتفظ فيه بكائن من الصّنف الممرّر في المعطى الثاني (RocketShipContract). يمكننا بعد ذلك استخدام المتغيّر واستدعاء الدالة.

بالعودة إلى دوال المتحكّم فيمكننا تغييرها كالتالي:

public function function1()
{
        return view('view1');
}
public function function2()
{
        return view('view2');
}

نرى بوضوح أن الطريقة الأخيرة تتيح قابليّةً أكبر لإعادة الاستخدام.

حقن الخدمة - كما رأينا - وسيلة مفيدة لإعادة استخدام وظائف من التطبيق وتقديمها في عروض، إلا أنه لا يُنصَح باستخدامها إلا عند الحاجة؛ ومن الضروريّ عدم المبالغة في استخدامها.

ترجمة -وبتصرّف- للمقال How to Use @inject in Blade in Laravel 5.1 لصاحبه Bill Keck.





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن