لارافيل, Blade / 2024-04-28

مشاركة البيانات في جميع الصفحات بإستخدام View Composer في لارافيل

مشاركة البيانات في جميع الصفحات بإستخدام View Composer في لارافيل

2024-04-28 وقت القراءه : 2 دقائق

جدول المحتويات


لا يخلو موقع من وجود navbar، لكن ببعض الأحيان  تكون المحتويات ( العناصر ) بشكل دايناميك، أي تأتي من قاعدة البيانات، وبالطبع للحصول عليها يجب كتابة جملة الإستعلام في أحد دوال الونترولر، لكن هذا الـ navbar سيتواجد في جميع صفحات الموقع ( الرئيسية، إتصل بنا، من نحن ....)، هل أقوم بتكرار الإستعلام في جميع الدوال التي تعرض هذه الصفحات.

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


بالطبع لا يجب تكرار الكود فهو يأخذ الكثير من الوقت وكذلك ضد مبدأ DRY، لذلك في لارافيل يمكن الإستعنانة بـ Composer لحل المشكلة السابقة.


إرسال البيانات لصفحات العرض؟

يوجد مجموعة من الدوال لتمرير البيانات وهي:

using with

public function index()
{
    $menuItems = Menu::where('active', '1')->get();
    return view('partials.navigation')->with('menuItems', $menuItems);
}

as second argument

public function index()
{
    $menuItems = Menu::where('active', '1')->get();
    return view('partials.navigation', ['menuItems' => $menuItems]);
}


using compact

public function index()
{
    $menuItems = Menu::where('active', '1')->get();
    return view('partials.navigation', compact('menuItems'));
}

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


مشاركة البيانات لجميع التطبيق (أعداد View Composer في لارافيل)

لمشاركة البيانات على لكل التطبيق نذهب للملف appServiceProfider.php والموجود في المسار

app/providers/appServiceProvider.php

حيث يوجد به دالتين register و boot 

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {

    }
}

ما يهمنا هنا دالة boot فبداخلها نضع جمل الإستعلام.

 public function boot(){
        View::share('menuItems', Menu::select( 'slug', 'title')->get());
 }

وفي ملف العرض يتم إستخدام المتغير menuItems

foreach($menuItems as $item){
    <a href="page/{{$item->slug}}">{{$item->title}}</a>
}


مشاركة البيانات في صفحات معينة بإستخدام view::composer

بإستخدام view::share يتم مشاركة البيانات مع جميع الصفحات، لكن ماذا لو أردت أن يتم مشاركة البيانات فقط مع صفحات معينة مثل صفحة history. index فقط.

هنا يتم إستخدام view::composer حيث يتم تحديد الصفحات التي نريدها فقط

View::composer(['front.index','front.history'],function($view){
    $view->with('educations',Education::select(
        'title','text',
    )->where('active',1)->get());
});

هنا لا أستطيع إستخدام المتغير education إلا في صفحة history, index

@foreach($educations as $education)
    {{ $edu->education }}
@endforeach

التعليقات
جابر الشيمي
منذ 3 سنوات

شرحجميل اول ره اشوفهاعتقد انه مفيد في حاله ان dynamic navbar items هل له استخدامات اخري

إضافة تعليق
Loading...