我目前正在使用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}}
我不明白为什么服务提供商会对迁移产生任何影响。
在我的服务提供程序boot()中(或者在我的情况下通过Repository类)访问数据库是不对的?
如果是这样,从db加载到自定义应用程序行为的最优雅方式是什么?
答案 0 :(得分:0)
是的,看起来这些服务提供程序正在引导程序中注册和引导,因此您在数据库存在之前就已经访问了它。
您可以轻松地使用服务提供商,并将其与常规旧课程点缀在一起。