Laravel:加载初始自定义设置类


Laravel: Loading initial custom settings class

我的目标是从配置文件中获取与应用程序相关的设置,并将它们加载到DataSource中,然后在应用程序中使用。在从配置文件加载的过程中,我想验证它们,如果它们失败,Laravel应该停止启动。我想这听起来有点混乱。希望下面的例子能有所帮助:

我的配置文件appSettings.phpapp/config中,只是一个例子:

return array(
     'color' => '',
     'texture' => 'mixed',
     'layers' => 3
);

我的DataSource类DataSource.phpsource/DataSource.php中,只是一个例子:

public class DataSource {
   public static function load() {
       if (Config::get('appSettings.color').empty()) {
           return false;
       }
       // Do other validations etc..
       return true;
   }
   public function getColorForRoom($roomId) {
       return something;
   }
}

现在,对我来说,什么地方是调用方法DataSource::load()的正确位置?。DataSource将在应用程序中用于获取某些数据,如调用getColorForRoom($roomId)函数。

也许在初始化程序中,或者在我可以做的地方:

if (!DataSource::load()) { 
    // Stop booting up Laravel
}

但我不确定该把它放在哪里,以及如何阻止应用程序启动。

可能的解决方案

我不确定这是否是正确的方法,但这似乎是一个很好的方法:

在我的bootstrap/start.php:

require $app['path.base'] . '/app/source/DataSource.php';
if (!DataSource::load()) {
    Log::error("Failed to load datasource");
    throw new ApplicationBootException();
}

再说一遍,我对此并不完全确定。这是一个糟糕的解决方案,还是还有其他更好的解决方案?

其他可能的解决方案是从以下答案中提到的路由或筛选器加载DataSource。

好吧,你可以把它放在filters.php文件中

App::before(function($request)
{
    if (!DataSource::load()) { 
         App::abort(500, 'Config is not correctly set');
    }
});

为什么不抛出自定义异常?然后,您可以捕捉到这个异常并重定向到一个类似404但对您的应用程序自定义的视图?

public class DataSource {
   public static function load() {
       if (Config::get('appSettings.color').empty()) {
           throw new ApplicationBootException();
       }
       // Do other validations etc..
       return true;
   }
}

您可以将其放置在路由文件中。

App::error(function(ApplicationBootException $exception, $code){
    //.. your code here to handle the exception
});

请注意,我只是以ApplicationBootException为例。您必须创建这个类并让它扩展Exception