web-dev-qa-db-de.com

Wie kann ich benutzerdefinierte Einstellungsdaten in Yii 2 global verfügbar machen?

Ich erstelle eine Anwendung, die einige Einstellungen in der Datenbank speichert. Idealerweise empfiehlt es sich, diese Einstellungen während des Bootstrappings zu laden und über ein Objekt global verfügbar zu machen.

Kann man das irgendwie machen und zu Yii::$app->params hinzufügen?

Wie können Sie eine Klasse erstellen und die Details als Array oder Objektinstanz zurückgeben?

16
Brett

Ok, ich habe herausgefunden, wie es geht.

Grundsätzlich muss das bootstrapInterface implementiert werden, ein Beispiel für meine Situation.

Legen Sie den Pfad zu Ihrer Klasse fest, die die Schnittstelle implementiert:

app/config/web.php:

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

Also habe ich eine Klasse mit dem Namen Settings.php an der Position platziert: app\base\Settings.php.

Dann ist das meine Settings.php-Datei:

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

    }

}

Ich kann jetzt über Yii:$app->params['settings'] global auf meine Einstellungen zugreifen.

Zusätzliche Informationen zu anderen Methoden zum Bootstrappen von hier .

34
Brett

Eine andere Möglichkeit besteht darin, die Methode init () im baseController zu überschreiben.

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;
            }
        }
}
....}    

Es liegt an dir. Ich habe diese Methode in Yii1 verwendet, jetzt würde ich die Bootstrap-Methode bevorzugen

0
Stas Panyukov

Ich bin ein bisschen spät zur Party, aber es gibt einen viel einfacheren Weg, dies zu tun.

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

Jetzt können Sie einfach auf diese Variablen mit der folgenden Syntax zugreifen

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