簡體   English   中英

如何在Laravel中將變量共享給所有控制器和視圖?

[英]How to share variables to all controllers and views in Laravel?

我有一個Laravel 5.5項目,我需要在所有控制器和所有視圖中共享一些變量,並具有一些全局默認值,然后可以在各種控制器方法中編輯這些默認值,最后這些視圖將顯示那些更新的變量。

例如:

$test = [1, 2, 3];

fooController.php BarMethod中,我會說:

$test[] = 4;

然后,帶有該BarMethod的視圖文件將看到[1, 2, 3, 4]

但是,如果我在testController.php BazMethod中說了別的話:

$test = array_merge($test, [100, 1000, 10000]);

然后屬於該方法的另一個視圖將看到[1, 2, 3, 100, 1000, 10000]

任何想法都歡迎。

謝謝。


好的,我們要澄清一下:我正在談論多個請求,第一個請求將發送到fooController ,第二個請求將發送到testController ,第n個請求將發送到某些nthController 在所有情況下,都有初始的$test變量及其默認值,然后控制器中所有請求的方法都可以更改默認的初始變量,然后將其發送到視圖。

例如,我可以通過在baseController設置$test的默認值,然后更新這兩個方法中的值來實現所有這些,但是我的真正問題是我需要在要發送到的變量列表中指定變量所有方法中的視圖。

因此,我需要一種自動將更新的$test變量發送到所有視圖的方法。 我當時在看服務提供商,但是在我看來,服務提供商會在編輯值之前完成其工作,因此初始值將顯示在視圖中,而不是更新后的值。

老實說,我認為會議不會在這種情況下有所幫助。

首先,我們必須在config文件夾中創建global.php文件。

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

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

如下訪問全局變量

config('global.clientid')

您可以創建一個中間件來填充Configuration變量,所有框架中的配置始終可用。

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

// index.blade.php

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

將值保存在配置中后,即可從視圖,控制器甚至模型中使用。

如果您不喜歡為此目的使用config,則可以創建一個Service Class(不是Service Provider),並將其聲明為Singleton。

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

如您所見,其行為類似於config,但是通過這種方法,您可以防止錯誤地即時覆蓋某些配置。 可以使用檢查和其他方法來改進代碼,這是如何執行此代碼的快速示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM