我正在创建一个在数据库中存储一些设置的应用程序,理想情况下,在引导期间加载这些设置并通过全局对象使它们可用是一件好事。
可以这样做并以某种方式添加到Yii::$app->params
吗?
例如,您可以创建一个类并将详细信息作为数组或对象实例返回吗?
答案 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方法