我目前正在开发 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 类)访问数据库是否有问题?
如果是这样,从数据库加载以自定义应用程序行为的最优雅的方式是什么?