如何在Yii 2中全局提供自定义设置数据?

时间:2015-01-05 11:22:06

标签: php yii yii2

我正在创建一个在数据库中存储一些设置的应用程序,理想情况下,在引导期间加载这些设置并通过全局对象使它们可用是一件好事。

可以这样做并以某种方式添加到Yii::$app->params吗?

例如,您可以创建一个类并将详细信息作为数组或对象实例返回吗?

3 个答案:

答案 0 :(得分:34)

好的,我发现了怎么做。

基本上你必须实施bootstrapInterface,下面就我的情况做一个例子。

设置实现接口的类的路径:

应用/配置/ web.php:

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

所以我在位置Settings.php放置了一个名为app\base\Settings.php的课程。

然后这是我的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'];
        }

    }

}

我现在可以通过Yii:$app->params['settings']全局访问我的设置。

有关引导东西的其他方法的更多信息here

答案 1 :(得分:1)

我参加派对有点晚了,但有一种更简单的方法可以做到这一点。

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => [
                    'log',
    ],
    //.............
    'params' = [
        'adminEmail' => 'admin@example.com',
        'defaultImage' => '/images/default.jpg',
        'noReplyEmail' => 'noreply@example.com'
    ],
];

现在您可以使用以下语法

简单地访问这些变量
$adminEmail = \Yii::$app->params['adminEmail'];

答案 2 :(得分:0)

另一种方法是覆盖baseController中的init()方法。

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

这取决于你。我曾经在Yii1中做过这个方法,但现在我更喜欢bootstrap方法