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

时间:2019-02-25 08:45:36

标签: php laravel

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

  

未定义变量

代码

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);

问题

知道为什么会出现未定义的错误吗?

更新

table

one

1 个答案:

答案 0 :(得分:2)

根据评论,我将假定它会起作用:

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

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


编辑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>。第一个方法调用。


编辑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