طريقة عمل
مزوّدات الخدمة والآليّة التي تتيح بها
مرونة أكبر في
التعامل مع
الأصناف في 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');
}
نرى بوضوح أن الطريقة الأخيرة
تتيح قابليّةً
أكبر لإعادة الاستخدام.
حقن
الخدمة - كما رأينا - وسيلة مفيدة لإعادة استخدام وظائف من التطبيق وتقديمها في عروض، إلا أنه لا يُنصَح باستخدامها إلا عند الحاجة؛ ومن الضروريّ عدم المبالغة في استخدامها.