web-dev-qa-db-ja.com

Laravelすべてのカスタムヘルパー、コントローラー、モデルのグローバル変数を設定します

私は以前にcodeigniterでこの質問をしたことがありますが、今はlaravelでこれについて質問したいと思います。

データベースの結果から取得したカスタムヘルパー、モデル、コントローラーのグローバル変数を設定したいと思います。

次に例を示します。

変数をどこに置くかわからない

 $data= DB::table('categories')->where('id', '2')->first();
 $this->product_var = $data->product;  **//main global variable**

カスタムヘルパー

function test() {
    if($this->product_var=="product name") {

    }
}

私のコントローラー

function index() {
    echo $this->product_var;
}

私のモデル

function get_data() {
     echo $this->product_var;
}

上記の私のスクリプトを見るとわかるように、$this->product_varはほとんどcustom helpermy controller、およびmy modelに使用されます。 codeigniterでは、librariesフォルダーにGlobals.phpを作成するか、変数をコアコントローラーに配置します。グローバル変数はどこに設定すればよいですか?

21
Willyanto Halim

@Mozammilが言及したように:

アイデアは「Laravel構成」を使用することです。これにより、1つのリクエストサイクルで値をグローバルスコープに保持できます。

Laravelのconfig()ヘルパーを使用して、アプリケーション全体からこれらの値にアクセスできます。

次のように一度設定する必要があります。

_config(['app.product_data' => $data]);
_

そして、これはアプリケーションでグローバルに利用できるようになります。config('app.product_data')を使用してデータにアクセスするだけです。

お気に入り:

カスタムヘルパー内

_function test() {
    if(config('app.product_data')->product_var=="product name") {
         //do something
    }

}
_

あなたのコントローラー

_function index() {
    echo config('app.product_data')->product_var;
}
_

あなたのモデル

_function get_data() {
     return config('app.product_data')->product_var;
}
_

これがお役に立てば幸いです。

8

構成は、グローバル変数を保持するための良い方法ではありません。フレームワークが示唆しているように、configにはプロジェクトの構成のみを含める必要があります。そして、それらは要求から独立している必要があります。

Laravelは、グローバル変数を処理するためのはるかに優れた方法を提供します。シングルトンを使用できます。どうして?シングルトンはアプリケーションを最も深いレベルで保持するため、リクエストの一部で呼び出すことができ、利用できます。リクエストの途中でシングルトンを変更するのはかなり難しいと宣言したことがあります。

このコードをYour AppServiceProviderに配置するか、独自のProductVarServiceProviderを作成することができます。

_App::singleton('product_var', function(){
     return DB::table('categories')->where('id', '2')->first();
}); 
_

これは、_product_var_の起源について確実にできる方法です。後で、コード内のどこでもヘルパー関数app('product_var')を使用できます。

グローバル変数を宣言するときは注意が必要です。

10
anwerj

私は最近 質問 に答えました。これにより、作成者はテーブル値をグローバルにキャッシュする非常に優れた方法を利用できました。

アイデアは、彼がテーブル値をフェッチし(キャッシュも)、後で構成変数としてアクセスできるように設定ServiceProviderを作成したというものです。

多分これはあなたにとっても非常にうまくいくでしょう。

4
Mozammil
Another simplest way to manage multiple data at same time.


     <?php

        namespace App\Utilities;

        class DataBus
        {
            private static $data = [];

            public static function setData($key, $value)
            {
                self::$data[$key] = $value;
            }

            public static function getData($key)
            {
                if(isset(self::$data[$key]))
                {
                    return self::$data[$key];
                }

                throw new \Exception("key is not set");
            }
        }

このように使用してください

<?php

namespace App\Xyz;

use App\Utilities\DataBus;


class ABC{

    function setData()
    {
        $data= DB::table('categories')->where('id', '2')->first();

        DataBus::setData('product_var', $data->product);

        // get data by below syntax anywhere in application after setting data.

        DataBus::getData('product_var');
    }
}
2
Pratik Soni