Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make custom settings data available globally in Yii 2?

Tags:

php

yii

yii2

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?

like image 665
Brett Avatar asked Jan 05 '15 11:01

Brett


2 Answers

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.

like image 200
Brett Avatar answered Nov 14 '22 21:11

Brett


I'm a little late to the party, but there is a much easier way to do this.

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => [
                    'log',
    ],
    //.............
    'params' = [
        'adminEmail' => '[email protected]',
        'defaultImage' => '/images/default.jpg',
        'noReplyEmail' => '[email protected]'
    ],
];

Now you can simply access those variables with the following syntax

$adminEmail = \Yii::$app->params['adminEmail'];
like image 36
SynackSA Avatar answered Nov 14 '22 22:11

SynackSA