Laravel: загрузка начального класса пользовательских настроек


Моя цель состоит в том, чтобы извлечь соответствующие настройки приложения из файла конфигурации и загрузить их в источник данных и использовать его в приложении. В процессе загрузки из конфигурационного файла я хотел бы проверить их, и если они не сработают, Laravel должен остановить загрузку. Звучит немного запутанно, я думаю. Надеюсь, что следующий пример поможет:

Мой конфигурационный файл appSettings.php находится в app/config, просто пример:

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

Мой класс источников данных 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).

Может быть, в intializers или где-нибудь я мог бы сделать:

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();
}
Опять же, я не совсем уверен в этом. Это плохое решение или есть другие лучшие решения?

Другие возможные решения-загрузка источника данных из маршрутов или фильтров, как указано в приведенных ниже ответах.

2 2

2 ответа:

Почему бы вам не создать собственное исключение? Затем вы можете поймать это исключение и перенаправить на представление, которое похоже на 404, но настроено для вашего приложения?

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

Вы можете поместить это в файл routes.

App::error(function(ApplicationBootException $exception, $code){
    //.. your code here to handle the exception
});
Пожалуйста, обратите внимание, что я просто использую ApplicationBootException в качестве примера. Вам придется создать этот класс и расширить его Exception

Ну, вы можете поместить его в фильтры.php файл

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