web-dev-qa-db-fra.com

Comment rendre les données de paramètres personnalisés disponibles globalement dans Yii 2?

Je crée une application qui stocke certains paramètres dans la base de données et, dans l'idéal, il serait bon de charger ces paramètres pendant l'amorçage et de les rendre disponibles via un objet globalement.

Cela peut-il être fait et ajouté à Yii::$app->params en quelque sorte?

Vous pouvez par exemple créer une classe et renvoyer les détails sous forme d'instance de tableau ou d'objet?

16
Brett

Ok, j'ai découvert comment faire.

Fondamentalement, vous devez implémenter le bootstrapInterface , un exemple ci-dessous pour ma situation.

Définissez le chemin d'accès à votre classe qui implémente l'interface:

app/config/web.php:

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => [
                    'log',
                    'app\base\Settings',
    ],
    //.............
];

J'ai donc placé une classe appelée Settings.php à l'emplacement suivant: app\base\Settings.php.

Ensuite, voici mon fichier Settings.php:

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'];
        }

    }

}

Je peux maintenant accéder à mes paramètres via Yii:$app->params['settings'] globalement.

Informations supplémentaires sur d’autres moyens d’amorcer des projets ici .

34
Brett

Une autre méthode consiste à remplacer la méthode init () dans la baseController.

class BaseController extends Controller{...    
public function init()
    {    
            if(Yii::$app->cache->get('app_config'))
        {
            $config = Yii::$app->cache->get('app_config');
            foreach ($config as $key => $val)
            {
                Yii::$app->params['settings'][$key] = $val->value;
            }
        }
        else
        {
            $config = Config::find()->all();
            $config = ArrayHelper::regroup_table($config, 'name', true);
            Yii::$app->cache->set('app_config', $config, 600);

            foreach ($config as $key => $val)
            {
                Yii::$app->params['settings'][$key] = $val->value;
            }
        }
}
....}    

C’est à vous. J'avais l'habitude de faire cette méthode dans Yii1 mais maintenant je préférerais la méthode bootstrap

0
Stas Panyukov

Je suis un peu en retard à la fête, mais il existe un moyen beaucoup plus facile de le faire.

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

Maintenant, vous pouvez simplement accéder à ces variables avec la syntaxe suivante

$adminEmail = \Yii::$app->params['adminEmail'];
0
SynackSA