Laravelのバージョンが5になってから、グローバルスコープを持つ変数の設定は、.env
とconfig/
のディレクトリの設定ファイルで、実用的しかも綺麗にまとまりました。変数の使用も、config('app.url')
と、プログラムのでどこでも簡単に取得できます。
また、DBの設定などのデフォルト設定ファイル以外にも、独自の設定ファイルも作成できます。
例えば、
config/local.php
というファイルを作成して、
return [ 'convert' => '/usr/bin/convert', // 画像変換のプログラムのパス名 'items_per_page' => 50, // 1ページのアイテム数 'max_upload_size' => 20, // 最大アップロードの画像サイズ(MB) 'company' => env('LOCAL_COMPANY', 'Lots of Bytes'), // 会社名 ];
とすれば、config('local.company')
と参照できます。
しかし、これらのグローバル変数設定の問題は、プログラムとして設定ファイルあるいは.env
でハードコードしなければならないことです。
グローバル変数をDBに値を保存して、管理画面で以下のように値を編集できて、プログラムの各所で使用できるようにするには、どうしたらよいのでしょうか?
幸いにも、config()
の関数は、取得だけでなく書き込みも可能なのです。
config(['global.admin_email' => 'abc@gmail.com']);
というように実行すれば、config('global.admin')
でabc@gmail.com
を返すことができます。
global.
とプリフィックスしたのは、単に他の変数と区別やグループ分けがしたいがためです。
ということは、DBからデータを読んでプログラムの実行時の最初に、config
して入れしまえば良いわけです。
このための適切な場所は、プログラムの初期に実行される、app/Providers/AppServiceProvider.php
の中です。
namespace App\Providers; use Illuminate\Support\ServiceProvider; use DB; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { $setting = DB::table('setting')->pluck('value', 'key'); config(['setting' => $setting]); } ... }
DBテーブルsetting
の中身は、以下とすると、
+------------+---------------------+---------------------+------------------+-------------------+ | setting_id | created_at | updated_at | key | value | +------------+---------------------+---------------------+------------------+-------------------+ | 1 | 2016-12-03 01:09:51 | 2016-12-03 01:09:51 | email_admin | admin@gmail.com | | 2 | 2016-12-03 01:09:51 | 2016-12-03 01:09:51 | email_from | from@gmail.com | | 3 | 2016-12-03 01:09:51 | 2016-12-03 01:09:51 | site_name | ララジャパン | +------------+---------------------+---------------------+------------------+-------------------+
例えば、config('setting.site_name')
の実行では、ララジャパン
の値が返ってきます。