phptest 2015-02-08 22:44:02 6312次浏览 2条回复 1 0 0

实现功能1:取出数据库全局变量

将表 {{%config}} 的记录取出,字段 varname 当变量名,字段value当值

// 配置全局 event 
[
    'on beforeAction' => ['app\events\initSiteConfig','assign']
] 

//文件 app\events\initSiteConfig 
namespace app\events;
use yii\base\Event;
use yii\db\Query;

class initSiteConfig extends Event
{

    public static function assign()
    {
        $rows = (new Query())
            ->select('*')
            ->from('{{%config}}')
            ->all();

        $arr = array();
        foreach ($rows as $row) {
            $arr[$row['varname']] = $row['value'];
        }

        \Yii::$app->params = array_merge(\Yii::$app->params, $arr);
    }
}

功能2:第一个模型 model 和action


// 文件 app\controllers\SiteController.php 的 actionIndex() 
use app\models\Area;

    public function actionIndex()
    {
        $area = new Area();
        $arrAreaIndex = $area->getAreaIndex();

        return $this->render('index', [
            'arrAreaIndex' => $arrAreaIndex
        ]);
    }

点评与疑惑:貌似这里 new Area() 如果放多少个就会执行多少次,是这样吗?为什么不让他不重复实例化?


// 文件 app\models\Area.php 

namespace app\models;
use yii\db\ActiveRecord;

class Area extends ActiveRecord
{

    /**
     * @description 获取单个
     *
     * @param $id
     *
     * @return array|bool
     */
    public function getOne($id)
    {
        $row = $this->findOne($id);

        return !empty($row) ? $row->attributes : false;
    }


    /**
     * @description 获取所有省份
     * @return array|\yii\db\ActiveRecord[]
     */
    public function getProv()
    {
        return $this->find()
            ->where(' level=1 ')
            ->orderBy(' sortid asc ')
            ->asArray()
            ->all();
    }


    /**
     * @description 返回省份城市 2级
     * @return array|\yii\db\ActiveRecord[]
     */
    public function getAreaIndex()
    {
        static $arr = null;

        if ($arr === null) {
            $cacheId = 'area';
            $arr = \Yii::$app->cache->get($cacheId);

            if (empty($arr)) {
                $arrRows = $this->find()
                    ->where(' level=1 or level=2 ')
                    ->orderBy(' level asc ,sortid asc ')//必须先按照level asc!
                    ->asArray()
                    ->all();


                foreach ($arrRows as $k => $row) {
                    if ($row['level'] == 1) {
                        $row['sub'] = array();
                        $arr[$row['id']] = $row;
                    } else if ($row['level'] == 2) {
                        $arr[$row['id']]['sub'][] = $row; //必须先按照level asc !
                    }
                }
                if (!empty($arr)) {
                    \Yii::$app->cache->set($cacheId, $arr);
                }
            }
        }

        return $arr;
    }
}


  • 回复于 2015-02-10 13:44 举报

    额。。controller有个 beforeAction方法 直接覆盖就可以了,所以不需要麻烦的去配置文件配置

    至于重复实例化,这个要自己实现单利吧

  • 回复于 2015-02-10 14:35 举报

    因为我必须根据域名来链接不同的数据库的,站群,所以整个网站都必须先初始化话的。

您需要登录后才可以回复。登录 | 立即注册