رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
تزریق کلاس حاوی اطلاعات دیتابیس به blade
#1
سلام
من یه ساید بار دارم که اطلاعاتش از دیتابیس میاد.یه کلاس ساختم که اطلاعات رو از دیتابیس میگیره و بعد با متد inject اون توی بلید ساید بار تزریق کردم..این روش اصولی هست؟ از لحاظ امنیتی مشکلی نداره؟

inject('sidebar','App\Sidebar')
پاسخ
تشکر شده توسط:
#2
اصولا برای sidebar و موارد مشابه بهتره یک ویو مستقل ایجاد کنید و کدهای مورد نظرتونو داخلش بنویسید و هرجایی لازم بود مثلا در layout اصلی اونو Include کنید و برای ارسال داده هم می تونید از View Composer استفاده کنید
موفقیت، نتیجه تشخیص درست است؛ تشخیص درست، نتیجه تجربه است؛ تجربه نیز اغلب نتیجه تشخیص نادرست است.



پاسخ
تشکر شده توسط:
#3
من همین کار رو کردم ولی مشکلم خوندن اطلاعات از دیتابیس برای اطلاعات ساید بار هست
اونا رو باید کجا بنویسم؟ (منطقی نیست که درون تمام کنترلرهای برنامه باشه)
===========================================================

ویرایش: طبق تحقیقاتم گفتن برو از 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 خالیه
پاسخ
تشکر شده توسط:
#4
چون متغیر رو درست ارسال نمیکنید توی متد boot همون AppServiceProvider کافیه این دستوراتو بنویسید

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

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

در ضمن اسم ویو ایی که می خواهید متغیر توش قابل دسترسی باشه باید از پوشه Views مسیردهی کنید مثلا الان تو مثال بالا تو پوشه layouts و فایل master.blade.php میخوام این متغیر ارسال بشه
موفقیت، نتیجه تشخیص درست است؛ تشخیص درست، نتیجه تجربه است؛ تجربه نیز اغلب نتیجه تشخیص نادرست است.



پاسخ
تشکر شده توسط: R.Rajai.Rad
#5
ممنون درست شد..مشکل از آدرس ویو بود که باید کامل مینوشتم(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);
   }
}
پاسخ
تشکر شده توسط:
#6
بله برای اینکه بخواهید پروژه مرتب تر باشه و هرچیزی سرجای خودش باشه بهتره یک پروایدر برای اینکار درست کنید ولی بعد اینکه کلاس provider رو ایجاد کردین باید اونو ثبت کنید. آیا توی مسیر config/app.php انتهای بخش providers اضافه کردین؟
موفقیت، نتیجه تشخیص درست است؛ تشخیص درست، نتیجه تجربه است؛ تجربه نیز اغلب نتیجه تشخیص نادرست است.



پاسخ
تشکر شده توسط: R.Rajai.Rad




کاربران در حال بازدید این موضوع: 1 مهمان