I'm creating an application which stores some settings in the database and ideally it would be good to load these settings during bootstrapping and make them available via an object globally.
Can this be done and added to Yii::$app->params
somehow?
Such as you can create a class and return the details as an array or object instance?
Ok, I found out how to do it.
Basically you have to implement the bootstrapInterface, an example below for my situation.
Set the path to your class that implements the interface:
app/config/web.php:
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => [
'log',
'app\base\Settings',
],
//.............
];
So I have placed a class called Settings.php
at the location: app\base\Settings.php
.
Then this is my Settings.php
file:
namespace app\base;
use Yii;
use yii\base\BootstrapInterface;
/*
/* The base class that you use to retrieve the settings from the database
*/
class settings implements BootstrapInterface {
private $db;
public function __construct() {
$this->db = Yii::$app->db;
}
/**
* Bootstrap method to be called during application bootstrap stage.
* Loads all the settings into the Yii::$app->params array
* @param Application $app the application currently running
*/
public function bootstrap($app) {
// Get settings from database
$sql = $this->db->createCommand("SELECT setting_name,setting_value FROM settings");
$settings = $sql->queryAll();
// Now let's load the settings into the global params array
foreach ($settings as $key => $val) {
Yii::$app->params['settings'][$val['setting_name']] = $val['setting_value'];
}
}
}
I can now access my settings via Yii:$app->params['settings']
globally.
Extra information on other ways to bootstrap stuff here.