如何在Laravel中的控制器雄辩模型数据之间共享?

时间:2019-04-08 07:38:10

标签: php laravel eloquent

让我们假设我拥有在整个页面中使用的变量,例如货币和语言。要在视图之间共享它们,我使用AppServiceProvider是这样的:

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        View::share('currenciesGlobal',Currency::get());
        View::share('languagesGlobal',Language::get());
    }
}

我可以在视图中轻松访问它们,但是我不能在控制器中进行访问。例如,我有一个产品列表,它根据用户选择的货币(存储在会话中作为currencyId)来计算价格。

例如:

public function getPrice()
{
    return number_format($this->price_retail / $this->sessionHelper->getCurrentCurrency()->conversion_rate, 2);
}

因此,有30种产品将对货币表创建30个查询。我希望有一个雄辩的全局变量,可以在每个控制器中访问。

我试图将数据存储在配置文件中(但是我不能使用eloquent / db);会议是一个坏主意。

有可能解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您可以使用继承:

创建一个BaseController并在那里定义全局变量,并确保所有控制器都对此BaseController进行扩展

示例:

<?php

namespace App\Http\Controllers;

use App\User;
use App\Http\Controllers\Controller;

class BaseController extends Controller
{
    /**
     * Add global vars, can even use eloquent models here.
     *
    */
    protected $global;

    public function __construct() 
    {
        // Fetch the user object
        $this->global = User::first();
        View::share('global', $this->global);
    }
}

现在确保您的其他控制器扩展了该控制器并访问$this->global

示例:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\BaseController;

class OtherController extends BaseController
{
    public function __construct() 
    {
        // call parent model constructor
        parent::__construct(); 
    }
    // $this->global is available throughout this controller.
    // ...