灰太狼

灰太狼

这家伙有点懒,还没写个性签名!

  • 财富值3290
  • 威望值150
  • 总积分5550

个人信息

  • 第一,日志是个组件,需要先配置在components下,配置如下:

    'components' => [
        'log' => [  //日志组件id
            'targets' => [  //targets是代表使用哪个方式存储日志,共有4个方式,下面是使用文件
                'error_file' => [  //error_file是自定义的,方便见名知道意思
                    'logFile' => '@admin/Runtime/logs/error.'.date('Ymd').'.log',//日志存放目录
                    'class' => 'yii\log\FileTarget', //指定使用4个方式其中之以的文件存储方式
                    'levels' => ['error'],//存放级别,错误级别的
                    'maxLogFiles' => 100,//最多存放的日志文件数
                ],
                'warning_file' => [
                    ...
                ],
                'info_file' => [
                    ...
                ]
            ]
        ]
    ]
    

    然后使用:Yii::info('信息!');

    既然说到了日志组件,不仅要知道怎么使用,还要知道他的实现原理:阐述一下个人见解,有错误请指出。

    yii框架在启动的时候已经加载里日志组件,(其实这里说日志组件是他确实是个组件,用来记录日志),但实际它加载的是另一个组件(日志分发器组件--我就这么叫的)
    在实例化这个分发器的时候会创建日志组件,注意这里会创建一个日志组件对象啊啊啊啊啊.
    多说两句:那么在哪里执行了这个 分发器的实例化呢?
    看你的配置main.php,是否有一项:'bootstrap' => ['log'],就是这个引导在框架启动的时候会执行。

    PS:创建日志组件时yii这里预留了一个扩展,就是在配置日志组件的时候,可以自己定义一个logger记录器
    $config['logger'];

    同时,把这个分发器对象给日志的dispatche属性(也就是在日志里可以使用分发器对象了)。
    然后我们 在使用 Yii::info('信息!'); 其实它执行的步骤是:

    public function info($message,$category = 'application')
    {
        static::getLogger()->log($message,Logger::LEVEL_INFO,$category);
    }
    
    //这里是获取一个日志对象,用来执行->log($日志信息)
    //这里是上面说的框架启动的时候会  创建一个日志组件对象啊啊啊啊啊  ,在执行Yii::info();还会执行,
    //因为初始户已经有了这个日志组件对象self::$_logger已经有值了,直接返回这个对象就行了。
    //
    public function getlogger()
    {
        if(self::$_logger !== null){
            return self::$_logger;
        } else {
            return self::$_logger = static::createObject('yii\log\Logger')
        }
    }
    

    日志对象有了就可以 ->log(); 执行了。

    public function log()
    {
        //主要是这句
        $this->flush();
    }
    
    public function flush($final = false)
    {
         //??$this->dispatcher 是在哪里来的?
         // 看上面介绍 -- 同时,同时,把这个分发器对象给日志的dispatche属性
         //所以 $this->dispatche就是 Dispatche对象了
        if($this->dispatcher instanceof Dispatcher){
            $this->dispatcher->dispatch($message,$final)
        }
    }
    

    下面的就一直调用下去就行了

    public function dispatch()
    {
        //这里就是循环你配置的那个日志组件数组;
        foreach($this->targets as $target){
            $target->collect($message,$final);//调用基类
            //后面不写了自己去基类看吧,
            //基类调用子类重写的exprot();输出了日志;
        }
    }
    
  • 2019-04-20 已签到
    连续签到5天,获得了20个金钱
  • 赞了说说
    不要生气好好干活
  • 回复了 的说说
    每天早上来了,打开电脑后,冲杯咖啡,听着音乐。。。然后就等着下班了!
    只能告诉你是在广东了,
  • //Yii::$app->request->get('id');
    <input type="hidden" name="theme_id" id="theme_id" value="<?= Yii::$app->request->get('id') ?>">
    
  • 没问题啊

    例如:
    $res = Orders::find->joinWith('subOrders')->where(['{{%orders}}.orderId'=>123])->one();
    //然后hasMany B
    
    print_r($res->toArray());//这是A的fields
    foreach($res->subOrders as $key => $val){
        print_r($val->toArray());//这是B的fields
    }
    

    PS:最后你组合成你要的结果就行了。
    Fields是生效的。但是一定要toArray();因为在toArray()里调用 $this->fields();

    (站长让我多用 markdown,我就用了)

  • 回复了 的说说
    每天早上来了,打开电脑后,冲杯咖啡,听着音乐。。。然后就等着下班了!
    我也不想这样啊,条件不允许啊。天天没事做,早上9点上班。一晃中午12点下班了,下午2点上班,睡觉得睡到3点才开始回到座位。下午再溜达一圈,打个酱油,看看新闻,6点下班了
  • 发表了说说
    每天早上来了,打开电脑后,冲杯咖啡,听着音乐。。。然后就等着下班了!
  • 2019-04-19 已签到
    连续签到4天,获得了20个金钱
  • 我觉得这两个使用的结果都是一样的。

    区别:
    例子1如果 joinWith([多个]) 会把多个关联查询出来然后全部缓存起来。(如果有不用的一些关联查询,会浪费效率去查询在缓存)

    例子2 ->关联对象, 是在使用的时候才去查询然后再缓存。(使用哪个关联才去调用查询并缓存)

    我是这样认为的。对么?

    上面保留证据,好像理解错了。

副总裁 等级规则
5550/10000
资料完整度
10/100
用户活跃度
0/100

Ta的关注

8

Ta的粉丝

28

Ta的访客

120