現在、Laravel 4 でアプリに取り組んでいます。このアプリでは、起動時にサービス プロバイダー (この場合はテーマ バージョン) を介していくつかのカスタム設定 (データベースに保存されている) をロードしようとしています。
<?php
namespace Blah\Providers;
use Illuminate\Support\ServiceProvider;
use Blah\Repositories\SettingRepositoryInterface;
use Blah\Repositories\EloquentSettingRepository;
use \App;
use \View;
class SettingRepositoryServiceProvider extends ServiceProvider {
public function register()
{
$this->app->singleton('SettingRepositoryInterface', 'Blah\\Repositories\\EloquentSettingRepository');
}
public function boot()
{
$this->settings = App::make('SettingRepositoryInterface');
$this->theme();
}
public function theme()
{
$version = $this->settings->load('active_theme');
$path = app_path() . '/views/' . $version;
View::addNameSpace('theme',$path);
}
}
すべてうまくいきますが、移行をロールバックした後、再び移行できないことがわかりました。
SQL エラーが発生するため、移行の実行時に何らかの理由でサービス プロバイダーのコードが実行されているようです。
{"error":{"type":"Exception","message":"SQLSTATE[42P01]: Undefined table: 7 ERROR: relation \"settings\" does not exist\nLINE 1: select * from \"settings\" where \"setting_name\" = $1 limit 1\n ^ (SQL: select * from \"settings\" where \"setting_name\" = ? limit 1) (Bindings: array (\n 0 => 'active_theme',\n))","file":"\/Users\/charlduplessis\/design\/projects\/blah\/_dev\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Connection.php","line":556}}
サービス プロバイダーが移行に影響を与える理由がわかりません。
Service Provider の boot() 内 (または私の場合は Repository クラス経由) でデータベースにアクセスするのは間違っていますか?
もしそうなら、データベースからロードしてアプリの動作をカスタマイズする最もエレガントな方法は何ですか?