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

时间:2014-10-20 05:51:39

标签: php laravel autoload

我的目标是从配置文件中获取与应用程序相关的设置,并将它们加载到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,如下面的答案中所述。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

为什么不抛出自定义异常?然后你可以捕获这个异常并重定向到一个类似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