我的目标是从配置文件中获取与应用程序相关的设置,并将它们加载到DataSource中,然后在应用程序中使用。在从配置文件加载的过程中,我想验证它们,如果它们失败,Laravel应该停止启动。我想这听起来有点混乱。希望下面的例子能有所帮助:
我的配置文件appSettings.php
在app/config
中,只是一个例子:
return array(
'color' => '',
'texture' => 'mixed',
'layers' => 3
);
我的DataSource类DataSource.php
在source/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