2

我目前正在开发 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 类)访问数据库是否有问题?

如果是这样,从数据库加载以自定义应用程序行为的最优雅的方式是什么?

4

1 回答 1

0

是的,看起来这些服务提供商正在注册并在引导程序中启动,所以你在它们存在之前就访问了数据库。

您可以轻松地不使用服务提供商,而只使用普通的旧类来点缀他。

于 2013-11-06T21:59:40.800 回答