Моя цель — извлечь настройки, относящиеся к приложению, из файла конфигурации, загрузить их в источник данных и использовать их в приложении. В процессе загрузки из конфигурационного файла я хотел бы проверить их, и если они потерпят неудачу, 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();
}
Опять же, я не совсем уверен в этом. Это плохое решение или есть другие лучшие решения?
Другие возможные решения — загрузка источника данных из маршрутов или фильтров, как указано в ответах ниже.
Почему бы вам не бросить пользовательское исключение? Тогда вы можете поймать это исключение и перенаправить в представление, похожее на 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
Хорошо — вы можете поместить его в файл filters.php
App::before(function($request)
{
if (!DataSource::load()) {
App::abort(500, 'Config is not correctly set');
}
});