Laravel引导变量在控制器中未定义

问题描述 投票:2回答:1

当我在控制器中使用该变量时,我有变量设置我在AppServiceProvider中的所有视图:

未定义的变量

Code

AppServiceProvider.php

View::composer('*', function ($view) {
    $ProductSettings = ProductSetting::all();
    foreach($ProductSettings as $psetting){
      $show_unavailable = $psetting->show_unavailable;
      $show_quantities = $psetting->show_quantities;
      $product_pagination = $psetting->pagination;
      $max_short_desc = $psetting->max_short_desc;
      $allow_delivery_time = $psetting->allow_delivery_time;
      $addtocart_on_attribute = $psetting->addtocart_on_attribute;
      $outofstock_lable = $psetting->outofstock_lable;
      $product_orderby = $psetting->orderby;
    }

    $view->with('show_unavailable', $show_unavailable);
    $view->with('show_quantities', $show_quantities);
    $view->with('product_pagination', $product_pagination);
    $view->with('max_short_desc', $max_short_desc);
    $view->with('allow_delivery_time', $allow_delivery_time);
    $view->with('addtocart_on_attribute', $addtocart_on_attribute);
    $view->with('outofstock_lable', $outofstock_lable);
    $view->with('product_orderby', $product_orderby);
});

调节器

//codes...

$products = Product::whereHas('categories', function ($query) use ($slug) {
  $query->where('slug', $slug);
})->paginate($product_pagination);

//codes...

基于我的数据库值product_pagination设置为12,这意味着我的代码如下:->paginate(12);

Question

知道为什么我会得到未定义的错误吗?

Update

table

one

php laravel
1个回答
2
投票

根据评论,我将假设这将工作:

$products = Product::whereHas('categories', function ($query) use ($slug) {
    $query->where('slug', $slug);
})->paginate(ProductSetting::first()->pagination);

由于您在product_settings表中只有一行,因此您只需访问该表的第一行,就可以从那里访问您需要的任何列。


Edit 1

根据回应,显然上述“太长”了。 我对这个问题唯一的另一种选择是:

App::singleton('product_settings', function () {
    return ProductSetting::first();
});

AppServiceProvider方法中,在boot(或您选择的任何提供者)中编写此方法。

然后,可以使用以下代码在任何地方使用它:

app('product_settings')->pagination;
// or, more simply:
app('product_settings')-><some column name>;

如果您认为代码仍然太多,那么您可以使用singleton方法使用相同的格式注册原始变量,并在第一次方法调用后添加-><some column name>


Edit 2

上面的编辑与原始解决方案没有任何不同,并且仍然会在每次调用app方法时进行查询。

如果要将数据库调用保持为每个控制器一个,那么可以将ProductSetting::first()存储到BaseController:

class BaseController extends \Controller
{

    protected $product_settings;

    public function __construct() 
    {
        // Fetch the Site Settings object
        $this->product_settings = ProductSetting::first();
    }

}

然后在每个控制器中你可以调用$this->product_settings->pagination

© www.soinside.com 2019 - 2024. All rights reserved.