جدول المحتويات
لا يخلو موقع من وجود 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.
لمشاركة البيانات على لكل التطبيق نذهب للملف 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>
}
جابر الشيمي
شرحجميل اول ره اشوفهاعتقد انه مفيد في حاله ان dynamic navbar items هل له استخدامات اخري