私は以前に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 helper
、my controller
、およびmy model
に使用されます。 codeigniterでは、librariesフォルダーにGlobals.phpを作成するか、変数をコアコントローラーに配置します。グローバル変数はどこに設定すればよいですか?
@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;
}
_
これがお役に立てば幸いです。
構成は、グローバル変数を保持するための良い方法ではありません。フレームワークが示唆しているように、configにはプロジェクトの構成のみを含める必要があります。そして、それらは要求から独立している必要があります。
Laravelは、グローバル変数を処理するためのはるかに優れた方法を提供します。シングルトンを使用できます。どうして?シングルトンはアプリケーションを最も深いレベルで保持するため、リクエストの一部で呼び出すことができ、利用できます。リクエストの途中でシングルトンを変更するのはかなり難しいと宣言したことがあります。
このコードをYour AppServiceProviderに配置するか、独自のProductVarServiceProviderを作成することができます。
_App::singleton('product_var', function(){
return DB::table('categories')->where('id', '2')->first();
});
_
これは、_product_var
_の起源について確実にできる方法です。後で、コード内のどこでもヘルパー関数app('product_var')
を使用できます。
グローバル変数を宣言するときは注意が必要です。
私は最近 質問 に答えました。これにより、作成者はテーブル値をグローバルにキャッシュする非常に優れた方法を利用できました。
アイデアは、彼がテーブル値をフェッチし(キャッシュも)、後で構成変数としてアクセスできるように設定ServiceProvider
を作成したというものです。
多分これはあなたにとっても非常にうまくいくでしょう。
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');
}
}