web-dev-qa-db-ja.com

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

Laravelとの仕事を始めたばかりです。ベースフレームワークとしてLaravel 4を使用して、数年前に作成したシステム全体を書き直す必要があります。私の古いシステムでは、いくつかの定数が宣言されたconstant.phpファイルと、多数の配列セット(たとえば、カテゴリステータス、イベントのタイプ、langなど)を含む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としてアクセスします。

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

アドバイスをありがとう。

EDIT#01

すべてのコントローラーとビューに渡したいデータは、私の投稿の冒頭の例のように、スクリプトで直接設定できます。butそれは、たとえばデータベースから動的に生成することもできます。このデータはカテゴリのリストです。ナビゲーションバーを生成するにはすべてのビューで必要ですが、ルーティングパターン(/ 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であり、値はカテゴリに関連付けられた情報です。

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

それで、Config変数として保存しても大丈夫ですか?または、これらのデータを他にどのように保存できますか?意味的に正しい最良の方法は何でしょうか?

ありがとう

74

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

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 Model のように使用できます:

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

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

Category::all();

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

104
lukasgeiter

定数の場合

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にはすべての構成ファイルが自動的に含まれるため、手動で含める必要はありません:)

20

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

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

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
3
Terminal

ローカライズを使用するのが最善の方法だと思います。

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

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

laravel 5.3以下で取得する

echo trans('messages.welcome');

または

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

5.4用

echo __('messages.welcome') 

laravel 5.0ローカリゼーション

または

laravel 5.4ローカリゼーション

2
Bill Stephen

上記の答えに追加するために、Laravel 5.3で使用を開始する前に、構成クラスを含める必要があります。

use Illuminate\Support\Facades\Config;
2
Jignesh Rawal

少なくともLaravel 5.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

1
blamb