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変数として保存しても大丈夫ですか?または、これらのデータを他にどのように保存できますか?意味的に正しい最良の方法は何でしょうか?
ありがとう
アプリケーション全体でグローバルに使用されるほとんどの定数については、構成ファイルに保存するだけで十分です。また、非常に簡単です
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();
何らかの理由でモデル全体がうまく機能しない場合は、独自のクラスとファサードの作成について考え始めることができます。または、すべての静的変数とメソッドを含むクラスを作成し、ファサードのものなしで使用することもできます。
定数の場合
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にはすべての構成ファイルが自動的に含まれるため、手動で含める必要はありません:)
Laravel 5のグローバル定数の場合、Configを呼び出すのは好きではありません。ルートグループで次のように定義します。
// global contants for all requests
Route::group(['prefix' => ''], function() {
define('USER_ROLE_ADMIN','1');
define('USER_ROLE_ACCOUNT','2');
});
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
ローカライズを使用するのが最善の方法だと思います。
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.3で使用を開始する前に、構成クラスを含める必要があります。
use Illuminate\Support\Facades\Config;
少なくとも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