如何在Laravel中将变量共享给所有控制器和视图?

时间:2017-10-12 13:26:12

标签: php laravel laravel-5

我有一个Laravel 5.5项目,我需要在所有控制器和所有视图中共享一些变量,并选择具有一些全局默认值,然后可以在各种控制器方法中编辑这些默认值,最后是视图会显示那些更新的变量。

例如:

fooController.php

$test[] = 4; BarMethod我会说:

[1, 2, 3, 4]

然后伴随该BarMethod的视图文件将显示testController.php

但如果我在$test = array_merge($test, [100, 1000, 10000]); BazMethod中说了别的话:

[1, 2, 3, 100, 1000, 10000]

然后我的另一个属于此方法的视图会看到fooController

欢迎任何想法。

感谢。

好的,所以澄清一下:我说的是多个请求,第一个请求将转到testController,第二个请求转到nthController,第n个转到$test。在所有情况下,初始$test变量都有其默认值,然后控制器中所有请求的方法都可以更改默认的初始变量,然后将其发送到视图。

所有这些我可以通过在baseController中设置默认值$test来实现,然后更新任一方法中的值,但我真正的问题是我需要指定要在所有方法中发送到视图的变量列表中的变量。

所以我需要的是一种自动将更新的CreateModel变量发送到所有视图的方法。我正在寻找服务提供商,但在我看来,服务提供商在编辑值之前会完成其工作,因此初始值将显示在视图中,而不是更新的值。

老实说,我认为会议无法在这种情况下提供帮助。

2 个答案:

答案 0 :(得分:0)

您可以创建一个中间件来填充配置变量,配置始终可以从所有框架中获得。

public function handle()
{
    config(['myCustomConfig.email' => 'me@example.com']);
}

// index.blade.php

<div>{{ config('myCustomConfig.email') }} </div>

保存配置上的值使其可以从视图,控制器甚至模型中使用。

如果您不想为此目的使用配置,您可以创建服务类(而不是服务提供商),并将其声明为单例。

// app/Services/SharingService.php

namespace App\Services;

class SharingService {

    private $shared = [];

    public function share($name, $value)
    {
        $this->shared[$name] = $value;
    }

    public function get($name, $default = null)
    {
        if (isset($this->shared[$name])) {
            return $this->shared[$name];
        }

        return $default;
    }
}

// AppServiceProvider.php

$this->app()->singleton('shared', function() {

    $sharingService = new SharingService();

    $sharingService->share('email', 'me@example.com');
    // ☝️ you can set values here or in any place, since it's a public method

    return $sharingService;
});

// index.blade.php

<div>{{ app('shared')->get('email') }}</div> <!-- me@example.com -->

// any Controller or model

$email = app('shared')->get('email');

正如您所看到的,行为就像配置一样,但是通过这种方法,您可以防止错误地覆盖某些配置。可以使用检查和其他方法来改进代码,这是一个快速的示例,说明如何执行此操作。

答案 1 :(得分:0)

首先,我们必须在config文件夹中创建global.php文件。

config/global.php,然后添加以下代码

return [
    'clientid' => '2',
    'code' => 'xyz
];

访问全局变量,如下所示

config('global.clientid')