Laravel:グローバル配列のデータと定数をどこに保存しますか?


82

Laravelを使い始めたばかりです。Laravel 4をベースフレームワークとして使用して、数年前に作成したシステム全体を書き直す必要があります。以前のシステムでは、constant.phpいくつかの定数が宣言されたglobals.phpファイルと、多数の配列セット(たとえば、カテゴリステータス、イベントのタイプ、言語など)を含むファイルがありました。そうすることで、私は次のようなものを使うことができます

foreach ( $langs as $code => $domain ) {
    // Some stuff
}

私のアプリのどこでも。

私の質問は、その情報をいわゆる「laravelの方法」でどのように保存できるかということです。ある種のオブジェクトを使用してこの情報を保存し、これをサービスとして設定し、ファサードを作成してみました。

app / libraries / Project / Constants.php

namespace PJ;

class Constants {

    public static $langs = [
            'es' => 'www.domain.es',
            'en' => 'www.domain.us',
            'uk' => 'www.domain.uk',
            'br' => 'www.domain.br',
            'it' => 'www.domain.it',
            'de' => 'www.domain.de',
            'fr' => 'www.domain.fr'
        ];
}

app / libraries / Project / ConstantsServiceProvider.php

namespace PJ;

use Illuminate\Support\ServiceProvider;

class ConstantsServiceProvider extends ServiceProvider {
    public function register() {
        $this->app->singleton('PJConstants', function() {
            return new Constants;
        });
    }
}

app / libraries / Project / ConstantsFacade.php

namespace PJ;

use Illuminate\Support\Facades\Facade;

class ConstantsFacade extends Facade {
    protected static function getFacadeAccessor() { 
        return 'PJConstants';
    }
}

composer.json

"psr-4": {
     "PJ\\": "app/libraries/Project"
},

そのため、そのプロパティにとしてアクセスしますPJ\Constants::$langs

これは機能しますが、それが最も効率的または正しい方法であるとは思えません。つまり、サービスプロバイダー全体やファサードなどを作成して、変数を「伝播」する正しい方法ですか?または、このデータをどこに置くべきですか?

アドバイスありがとうございます。

編集#01

データ私は、直接私のポストの冒頭の例のように、スクリプトで設定することができ、すべてのコントローラとビューに渡したい、しかし、それはまた、例えば、データベースから、動的に生成することができます。このデータは、カテゴリのリストである可能性があります。ナビゲーションバーを生成するには、すべてのビューでそれらが必要ですが、いくつかのルーティングパターン(など/category/subcategory/product)を定義したり、いくつかのコントローラーでいくつかの情報を解析したりするためにも必要です(X製品を保持するカテゴリから情報を取得するなど)。

私の配列は次のようなものです:

$categories = [
    1 => ['name' => 'General', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    2 => ['name' => 'Nature', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    3 => ['name' => 'World', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    4 => ['name' => 'Animals', 'parent' => 2, 'description' => 'Lorem ipsum...']
]

ちょうど例として。インデックスはカテゴリのIDであり、値はカテゴリに関連付けられた情報です。

この配列も、すべてのコントローラーとビューで使用できる必要があります。

それで、それを構成変数として保存する必要がありますか?これらのデータを他にどのように保存できますか。最良で意味的に正しい方法は何でしょうか?

回答:


118

アプリケーション全体でグローバルに使用されるほとんどの定数については、構成ファイルに保存するだけで十分です。それもかなり簡単です

app/configディレクトリに新しいファイルを作成します。それを呼びましょうconstants.php

そこで、構成値の配列を返す必要があります。

return [
    'langs' => [
        'es' => 'www.domain.es',
        'en' => 'www.domain.us'
        // etc
    ]
];

そして、あなたは次のようにそれらにアクセスすることができます

Config::get('constants.langs');
// or if you want a specific one
Config::get('constants.langs.en');

そして、あなたもそれらを設定することができます

Config::set('foo.bar', 'test');

設定した値は保持されないことに注意してください。現在のリクエストでのみご利用いただけます。

更新

構成は、データベースから生成された情報を格納するための適切な場所ではない可能性があります。次のようなEloquentモデルを使用できます。

class Category extends Eloquent {
    // db table 'categories' will be assumed
}

そして、すべてのカテゴリをクエリします

Category::all();

何らかの理由でモデル全体がうまく機能しない場合は、独自のクラスとファサードを作成することを検討し始めることができます。または、すべての静的変数とメソッドを使用してクラスを作成し、ファサードを使用せずに使用することもできます。


簡単な方法!このようにすることは、プロジェクトコードですでに設定されている「定数配列」にとっては素晴らしいことです。しかし、実行時に生成され、他のどこからでもグローバルにアクセスしたい変数や配列についてはどうでしょうか。global.phpにいくつかの基本的な開始コードがあり、いくつかの変数が作成され、いくつかのコントローラーまたはビューで必要になります。その構成変数の値を設定する方法、または実行時に新しい変数を作成する方法はありますか?
マルコMadueñoメヒア

こんなに簡単だとは思いませんでした。私はそれを答えとしてマークしますが、最後にもう1つ疑問があります。グローバルにアクセスできるようにする必要がある変数の1つは、データベースから取得した一連のカテゴリを保持します。ナビゲーションメニューに使用されるため、すべてのビューに必要ですが、一部のコントローラーやルーティングにも必要です。このタイプのデータを構成変数として保存することは(意味的には)正しいですか?それとも他の方法で保存する必要がありますか?
マルコMadueñoメヒア

2
@Corner 5.0以降、configディレクトリはプロジェクトディレクトリのルートに直接配置されています。
lukasgeiter 2015

4
Laravel 5以降を使用している場合は、「useConfig;」を追加する必要があります。コントローラに入れるか、次のようにConfigのフォントにスラッシュを入れます。\ Config :: get( 'constants.langs');
rotaercz 2017

2
今使用するconfig()代わりにヘルパーを使用できますConfig::get()
リース

23

定数の場合

configディレクトリにconstants.phpファイルを作成します:-

define('YOUR_DEFINED_CONST', 'Your defined constant value!');

return [

'your-returned-const' => 'Your returned constant value!'

];

あなたはそれらを次のように使うことができます:-

echo YOUR_DEFINED_CONST . '<br>';

echo config('constants.your-returned-const');

静的アレイの場合

configディレクトリにstatic_arrays.phpファイルを作成します。-

class StaticArray
{

    public static $langs = [
        'es' => 'www.domain.es',
        'en' => 'www.domain.us',
        'uk' => 'www.domain.uk',
        'br' => 'www.domain.br',
        'it' => 'www.domain.it',
        'de' => 'www.domain.de',
        'fr' => 'www.domain.fr'
    ];

}

あなたはそれを次のように使うことができます:-

echo StaticArray::$langs['en'];

注:Laravelにはすべての構成ファイルが自動的に含まれるため、手動で含める必要はありません:)


次のような一部のコンソールコマンドでは使用できませんroute:cacheUse of undefined constant ID - assumed 'ID'
AliN 1119年

13

Laravelで共通定数ファイルを作成する

app / constants.php

    define('YOUR_CONSTANT_VAR', 'VALUE');

    //EX
    define('COLOR_TWO', 'red');

composer.json は、composer.jsonの自動ロード時にファイルの場所を追加します

"autoload": {
    "files": [
        "app/constants.php"
    ]
}

この変更を有効にするには、ターミナルで次のコマンドを実行して、Laravelの自動ロードファイルを再生成する必要があります。

composer dump-autoload

1
共有していただきありがとうございます。自動
読み込みを

それが私の喜び@ChannaveerHakariだ
Parth kharecha

8

Laravel 5のグローバル定数の場合、Configを呼び出すのは好きではありません。私はそれらを次のようにルートグループで定義します。

// global contants for all requests
Route::group(['prefix' => ''], function() {
    define('USER_ROLE_ADMIN','1');
    define('USER_ROLE_ACCOUNT','2');
});

定数が多数ある場合、それらを別のファイルに保存してから、ルートの関数に含める方法はありますか?また、行['prefix' => '']は何をしていますか?私はそれが連想配列であることを知っていますが、これは定数をすべてのルートで利用できるようにしますか?ありがとう。
user3089840 2015年


別の注意点として、私が何をしても、PHPUnitはそれを気に入らないようです。私があなたのやり方でそれを試してみると、ブラウザ上ですべてが正常に機能しますが、PHPUnitは私の定数がすでに定義されていると言っています、そしてそれは単に真実ではありません。
user3089840 2015年

構成をキャッシュしている場合、それらに定数を定義することは機能しません。
ゼロと1

プレフィックスを使用することをお勧めします
Arun Yokesh 2017年

4

ローカリゼーションを使用するのが最善の方法だと思います。

で新しいファイルmessages.phpを作成しますresources/lang/enenこれが私の設定であるためconfig/app 'locale'=>'en')すべての値の配列を返します

return [
    'welcome' => 'Welcome to our application'
];

Laravel5.3以下で取得するには

echo trans('messages.welcome');

または

echo Lang::get('messages.welcome');

5.4用

echo __('messages.welcome') 

laravel5.0のローカリゼーション

または

laravel5.4のローカリゼーション


そのとおりです。初心者からのサブクエリは、そのmessage.phpファイルを読み取り、配列としてキー値を取得する方法です。それを配列として読み取り、クライアント側ライブラリ、つまり特定の文字列を処理するAngularJSのjson応答として送信したいと思います。
ゴピナト

2

上記の回答に追加するには、Laravel5.3で使用を開始する前にconfigクラスを含める必要があります

use Illuminate\Support\Facades\Config;

または、関数config()を使用するだけです。
2017年

2

少なくともLaravel5.4では、コンストラクターでそれらを作成できます。

public function __construct()
{
  \Config::set('privileged', array('user1','user2');
  \Config::set('SomeOtherConstant', 'my constant');     
}     

次に、メソッドでこのように呼び出すことができます。

\Config::get('privileged');

モデルなどの静的メソッドに特に役立ちます。

Laracasts.comのリファレンスhttps://laracasts.com/discuss/channels/general-discussion/class-apphttpcontrollersconfig-not-found


0

ファイルconstants.phpファイルをconfigディレクトリに置き、そのファイルで定数を定義するだけで、そのファイルは自動ロードされ、Laravel6 +でテストされます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.