تالار گفتمان nCIS.ir

نسخه‌ی کامل: تزریق کلاس حاوی اطلاعات دیتابیس به blade
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام
من یه ساید بار دارم که اطلاعاتش از دیتابیس میاد.یه کلاس ساختم که اطلاعات رو از دیتابیس میگیره و بعد با متد inject اون توی بلید ساید بار تزریق کردم..این روش اصولی هست؟ از لحاظ امنیتی مشکلی نداره؟

inject('sidebar','AppSidebar')
اصولا برای sidebar و موارد مشابه بهتره یک ویو مستقل ایجاد کنید و کدهای مورد نظرتونو داخلش بنویسید و هرجایی لازم بود مثلا در layout اصلی اونو Include کنید و برای ارسال داده هم می تونید از View Composer استفاده کنید
من همین کار رو کردم ولی مشکلم خوندن اطلاعات از دیتابیس برای اطلاعات ساید بار هست
اونا رو باید کجا بنویسم؟ (منطقی نیست که درون تمام کنترلرهای برنامه باشه)
===========================================================

ویرایش: طبق تحقیقاتم گفتن برو از Service Provider , View::Composer استفاده کن.برای همین رفتم توی کلاس RouteServiceProvider  در داخل تابع boot اینارو نوشتم

public function boot(Router $router)
    {
        //
        parent::boot($router);
        view::composer('sidebar',function($view){
            $menus =Menus::all();
            view::share('menus',$menus);
        });
    }

ولی متاسفانه کار نمیکنه..با دیباگ چک کردم اصلا وارد فانکشن نمیشه و برای همین متغیر menus خالیه
چون متغیر رو درست ارسال نمیکنید توی متد boot همون AppServiceProvider کافیه این دستوراتو بنویسید

view()->composer('layouts.master', function ($view) {
    $menus = Menus::all();
    $view->with('menus', $menus);
});

و بعد میتونید متغیر menus$ روی توی اون ویو بهش دسترسی داشته باشید

در ضمن اسم ویو ایی که می خواهید متغیر توش قابل دسترسی باشه باید از پوشه Views مسیردهی کنید مثلا الان تو مثال بالا تو پوشه layouts و فایل master.blade.php میخوام این متغیر ارسال بشه
ممنون درست شد..مشکل از آدرس ویو بود که باید کامل مینوشتم(layout.sidebar)

بهتر نیست برای این کار یه  service provider جدا داشته باشیم (مثلا ComposerServiceProvider) و کدهای کوئری و فراخوانی ویو رو هم به بزاریم توی یک کلاس دیگه(SidebarComposer)؟ یعنی اینجوری بشه

کد:
class ComposerServiceProvider extends ServiceProvider
{
  public function boot()
  {
     $view->composer('layout.sidebar','App\Http\SidebarComposer');
     
      });

الان با این روش میگه کلاس SidebarComposer موجود نیست

اینم کلاسش


کد:
namespace App\Http\SidebarComposer;
use Illuminate\Contracts\View\View;

class SidebarComposer
{

   public function compose(View $view)
   {
           $menus =Menus::all();
           $view->with('menus',$menus);
   }
}
بله برای اینکه بخواهید پروژه مرتب تر باشه و هرچیزی سرجای خودش باشه بهتره یک پروایدر برای اینکار درست کنید ولی بعد اینکه کلاس provider رو ایجاد کردین باید اونو ثبت کنید. آیا توی مسیر config/app.php انتهای بخش providers اضافه کردین؟