在引导时从DB加载自定义设置。

时间:2013-11-06 12:05:46

标签: laravel laravel-4 migration

我目前正在使用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加载到自定义应用程序行为的最优雅方式是什么?

1 个答案:

答案 0 :(得分:0)

是的,看起来这些服务提供程序正在引导程序中注册和引导,因此您在数据库存在之前就已经访问了它。

您可以轻松地使用服务提供商,并将其与常规旧课程点缀在一起。