Yii2 使用Event -2 ,如何使用事件

这里说的是通过行为的方式绑定事件

1.定义行为事件类: MyBehavior.php

<?php  
namespace myapp\frontend\code\ECM\Customer\events;  
  
use yii\db\ActiveRecord;  
use yii\base\Behavior;  
use myapp\frontend\code\ECM\Cms\controllers\IndexController;  
class MyBehavior extends Behavior  
{  
    // 其它代码  
    const EVENT_HELLO = 'myhello';  
      
    public function events()  
    {  
        return [  
            self::EVENT_HELLO => 'hello',  
        ];  
    }  
  
    public function hello($event)  
    {  
        \Yii::info($event->message,'mylog');  
    }  
}  
?>

2.定义数据格式类:

<?php  
  
namespace myapp\frontend\code\ECM\Customer\events;  
  
use Yii;  
use yii\base\Model;  
use yii\base\Event;  
/**  
 * ContactForm is the model behind the contact form.  
 */  
class MessageEvent extends Event  
{  
    public $message;  
}

3.在行为函数中绑定定义的   行为事件

<?php  
namespace myapp\frontend\code\ECM\Cms\controllers;  
  
use Yii;  
use myapp\frontend\code\ECM\BaseController;  
use myapp\frontend\code\ECM\Customer\events\MyBehavior;  
use myapp\frontend\code\ECM\Customer\events\Ha;  
use myapp\frontend\code\ECM\Customer\events\MessageEvent;  
  
class IndexController extends BaseController  
{  
     
   # 定义Event的名字  
    //const EVENT_HELLO = 'my hello';  
      
     public function behaviors()  
    {  
        return [  
             
            # 命名行为, 绑定行为事件  
            # 绑定后 会通过这个类的events()  返回所有的事件数组,然后全部绑定。  
            # 道理就是:通过行为的方式绑定对应的event , 和on函数绑定一个原理  
            'myBehavior2' => MyBehavior::className(),  
      
        ];  
    }  
      
    public function actionIndex()  
    {  
          
        #定义传递数据的格式 Event  
        $event = new MessageEvent;  
        # 赋值  
        $event->message = 'good';  
          
        # 触发事件   
        # 这里已经不需要on绑定,因为在行为中已经绑定完成  
        $this->trigger(MyBehavior::EVENT_HELLO,$event);  
          
        return $this->render('index');  
    }  
      
      
      
      
}

4.打印日志查看:tail -f  app/runtime/logs/my.log

2015-11-17 11:50:54 Array[info][mylog] good  
    in /www/web/develop/test/erp/myapp/frontend/code/ECM/Customer/events/MyBehavior.php:21  
    in /www/web/develop/test/erp/myapp/frontend/code/ECM/Cms/controllers/IndexController.php:36

已经输出对应的  $EventMessage->mesage值。

good!

Yii2 使用Event -1 ,如何使用事件

1.首先需要 定义 事件传递的数据格式类:

<?php  
  
namespace myapp\frontend\code\ECM\Customer\events;  
  
use Yii;  
use yii\base\Model;  
use yii\base\Event;  
/**  
 * ContactForm is the model behind the contact form.  
 */  
class MessageEvent extends Event  
{  
    public $message;  
}

在这个 MessageEvent 里面就定义了一个变量  $message

2.

编写事件:   事件只要定义个hello 函数,然后参数为  上面第一步分传递的$event 对象,里面包含$message 参数,如果这个Event执行

那么。将会写入日志。

<?php  
  
namespace myapp\frontend\code\ECM\Customer\events;  
  
use Yii;  
  
/**  
 * ContactForm is the model behind the contact form.  
 */  
class Ha   
{  
    public function hello($event){  
        Yii::info($event->message,'mylog');  
    }  
}

3

绑定和触发事件

<?php  
namespace myapp\frontend\code\ECM\Cms\controllers;  
  
use Yii;  
use myapp\frontend\code\ECM\BaseController;  
  
use myapp\frontend\code\ECM\Customer\events\Ha;  
use myapp\frontend\code\ECM\Customer\events\MessageEvent;  
  
class IndexController extends BaseController  
{  
     
   # 定义Event的名字  
    const EVENT_HELLO = 'my hello';  
      
    public function actionIndex()  
    {  
          
        #定义传递数据的格式 Event  
        $event = new MessageEvent;  
        # 赋值  
        $event->message = 'good';  
        # 绑定事件Event  这个事件对应的是:Ha->hello($event);  
        $this->on(self::EVENT_HELLO, [new \myapp\frontend\code\ECM\Customer\events\Ha(), 'hello']);  
        # 触发事件 ,$event 这个对象传递到  Ha->hello($event);   
        $this->trigger(self::EVENT_HELLO,$event);  
          
        return $this->render('index');  
    }  
      
      
      
      
}

从这里看,貌似没有多大用处,直接作为参数调用就行了,两边都写代码麻烦

但是,事件是可以不再文件的函数内书写绑定,可以在new 对象之后再绑定

$foo = new Foo;  
  
// 处理器是全局函数  
$foo->on(Foo::EVENT_HELLO, 'function_name');  
  
// 处理器是对象方法  
$foo->on(Foo::EVENT_HELLO, [$object, 'methodName']);

也可以在Behavior 行为绑定事件。

譬如在一个类保存的时候可以触发一个 保存后的事件

如果这个类没有绑定事件,那么执行为空

如果绑定,就会执行

1.如果一个Event,被多个类执行,一般使用Behavior的方式进行绑定,譬如  Avtive Record 保存后写入log

这种情况一般是自己写的类,使用别人写的,或者自己写的Event。进行一些处理

2.如果是系统的类,类的事件触发已经写好,但是没有绑定事件,默认什么也没有执行,譬如active Record 的 beforeSave操作

对于这种,我们不能去修改系统的代码,所以,我们可以通过$foo->on()的方式进行绑定,然后在执行save操作,就会触发beforeSave();

当然,我们可以定义一个子类,继承ActiveRecord,然后再里面添加行为。

Yii2 – 使用数据库(DB – Mysql) Log

调试程序的时候,我们可以加入exit断点进行输出的方式调试程序,这种方式比较的简单快捷,但是有局限性 ,譬如API接口传递数据,如果出现数据没有传递的情况,我们需要查看log,有时候我们想要查看很多的中间值,这样,我们在yii2开发的过程中,就需要用到log。

对于log,有文件的log,文件的log,每次使用需要打开log,这个比较麻烦,对于持续的输出,我们需要使用linux命令tail -f  xxx.log 来查看持续的log.

使用db log,吧log存储到表中,我们可以在后台开启一个log查看过滤的功能,每次执行,直接在后台查看,方便快捷,下面讲述如果在yii2中开启db log

1.加入log组件的配置:

'log' =>[  
            # 追踪级别  
            # 消息跟踪级别  
            # 在开发的时候,通常希望看到每个日志消息来自哪里。这个是能够被实现的,通过配置 log 组件的 yii\log\Dispatcher::traceLevel 属性, 就像下面这样:  
            'traceLevel' => YII_DEBUG ? 3 : 0,  
              
            # 通过 yii\log\Logger 对象,日志消息被保存在一个数组里。为了这个数组的内存消耗, 当数组积累了一定数量的日志消息,日志对象每次都将刷新被记录的消息到 log targets 中。 你可以通过配置 log 组件的 yii\log\Dispatcher::flushInterval 属性来自定义数量  
            'flushInterval' => 1,  
              
            'targets' => [  
                'db' =>[  
                    //'levels' => ['warning'],  
  
                    'categories' => ['appadmin'],  
                    #'class' => 'yii\log\FileTarget',  
                    'class' => 'yii\log\DbTarget',  
                    # 当 yii\log\Logger 对象刷新日志消息到 log targets 的时候,它们并 不能立即获取导出的消息。相反,消息导出仅仅在一个日志目标累积了一定数量的过滤消息的时候才会发生。你可以通过配置 个别的 log targets 的 yii\log\Target::exportInterval 属性来 自定义这个数量,就像下面这样:  
                    'exportInterval' => 1,  
                    # 输出文件  
                    //'logFile' => '@app/runtime/logs/appadmin.log',  
                    'logTable' => '{{%system_log}}',  
                    # 你可以通过配置 yii\log\Target::prefix 的属性来自定义格式,这个属性是一个PHP可调用体返回的自定义消息前缀  
                    //'prefix' => function ($message) {  
                          
                    //  return $message;  
                    //},  
                    # 除了消息前缀以外,日志目标也可以追加一些上下文信息到每组日志消息中。 默认情况下,这些全局的PHP变量的值被包含在:$_GET, $_POST, $_FILES, $_COOKIE,$_SESSION 和 $_SERVER 中。 你可以通过配置 yii\log\Target::logVars 属性适应这个行为,这个属性是你想要通过日志目标包含的全局变量名称。 举个例子,下面的日志目标配置指明了只有 $_SERVER 变量的值将被追加到日志消息中。  
                    # 你可以将 logVars 配置成一个空数组来完全禁止上下文信息包含。或者假如你想要实现你自己提供上下文信息的方式, 你可以重写 yii\log\Target::getContextMessage() 方法。  
                     'logVars' => [],  
                ],  
                /*  
                'file' =>[  
                    'levels' => ['trace'],  
                    'categories' => ['mylog'],  
                    'class' => 'yii\log\FileTarget',  
                    # 当 yii\log\Logger 对象刷新日志消息到 log targets 的时候,它们并 不能立即获取导出的消息。相反,消息导出仅仅在一个日志目标累积了一定数量的过滤消息的时候才会发生。你可以通过配置 个别的 log targets 的 yii\log\Target::exportInterval 属性来 自定义这个数量,就像下面这样:  
                    'exportInterval' => 1,  
                    # 输出文件  
                    'logFile' => '@app/runtime/logs/my.log',  
                    # 你可以通过配置 yii\log\Target::prefix 的属性来自定义格式,这个属性是一个PHP可调用体返回的自定义消息前缀  
                    'prefix' => function ($message) {  
                          
                        return $message;  
                    },  
                    # 除了消息前缀以外,日志目标也可以追加一些上下文信息到每组日志消息中。 默认情况下,这些全局的PHP变量的值被包含在:$_GET, $_POST, $_FILES, $_COOKIE,$_SESSION 和 $_SERVER 中。 你可以通过配置 yii\log\Target::logVars 属性适应这个行为,这个属性是你想要通过日志目标包含的全局变量名称。 举个例子,下面的日志目标配置指明了只有 $_SERVER 变量的值将被追加到日志消息中。  
                    # 你可以将 logVars 配置成一个空数组来完全禁止上下文信息包含。或者假如你想要实现你自己提供上下文信息的方式, 你可以重写 yii\log\Target::getContextMessage() 方法。  
                     'logVars' => [],  
                ],  
                */  
            ],  
        ],

 

对于上面的配置,我们需要看的是targets中的配置,上面配置了两个log,一个是db,一个是file。

他们的共同处:

1.1categories,代表log的类别,类别是为了在使用log的时候进行写入不同的log文件,譬如,我们定义了categories为appadmin,按照下面的方式调用log,会把log 输出到当前的配置

\Yii::info('111111111','appadmin');

1.2.输出:

File Log 配置的是 logFile,log信息写入到配置的这个文件中,这个文件要设置可写

Db Log  配置的是 logTable,这里填写对应的表名

2. 输出

对于文件输出,我们需要新建这个文件,并设置文件为可写

对于db log,我们需要建立表。

上面的配置,需要加入到console config  或者common config中,因为只有加入了配置,console(控制台)主体执行migration脚本,才能找到配置

执行migration脚本:

./yii migrate --migrationPath=@yii/log/migrations/

执行完成后,MySQL中会出来一个system_log的表。

 

3.使用log

\Yii::info('111111111','appadmin');

其中1111111代表输出的log信息

appadmin代表上面配置的类别   categories。

4. 在后台建立表的查看功能,这样就可以通过后台查看log,当然也可以用phpmyadmin查看具体的log,就是有点费劲

 


上面完成了db log  和 file log的配置。

 

 

 

Yii2 – 安装高级模板 advanced project template

在yii2官网,可以看到有两个版本,一个是base template,一个是advanced tempalte,高级模板更加强大一些,初始化后有一个公用的common,三个控制入口,frontend,backend,console,分别对应前台,后台,控制台,很适合线上有一定规模的网站,譬如电商网站,我们用frontend做前端显示,backend做后台,console做一些命令行的数据处理,cron定时处理脚本等,这里,我所要说的是,如何从零安装yii2的高级模板。

composer堪称神器,类似于yum安装,自己解决包依赖,所以,安装的过程中也是用composer来安装。

1.安装composer

curl -sS https://getcomposer.org/installer | php  
mv composer.phar /usr/local/bin/composer 
composer self-update

第一行为下载composer,具体执行log:

[root@iZ942k2d5ezZ ~]# curl -sS https://getcomposer.org/installer | php 
All settings correct for using Composer
Downloading 1.0.2...

Composer successfully installed to: /root/composer.phar
Use it: php composer.phar

 

2.初始安装:fxp/composer-asset-plugin

composer global require "fxp/composer-asset-plugin:~1.1.1"

3.安装yii2

composer create-project --prefer-dist yiisoft/yii2-app-advanced yii-application

安装log如下:

[root@iZ942k2d5ezZ test]# composer create-project --prefer-dist yiisoft/yii2-app-advanced yii-application
Running composer as root/super user is highly discouraged as packages, plugins and scripts cannot always be trusted
Installing yiisoft/yii2-app-advanced (2.0.8)
  - Installing yiisoft/yii2-app-advanced (2.0.8)
    Downloading: 100%         

Created project in yii-application
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing yiisoft/yii2-composer (2.0.4)               
    Loading from cache

  - Installing swiftmailer/swiftmailer (v5.4.1)
    Loading from cache

  - Installing bower-asset/jquery (2.2.3)
    Loading from cache

  - Installing bower-asset/yii2-pjax (v2.0.6)
    Loading from cache

  - Installing bower-asset/punycode (v1.3.2)
    Loading from cache

  - Installing bower-asset/jquery.inputmask (3.2.7)
    Loading from cache

  - Installing cebe/markdown (1.1.0)
    Loading from cache

  - Installing ezyang/htmlpurifier (v4.7.0)
    Downloading: 100%         

  - Installing yiisoft/yii2 (2.0.8)
    Downloading: 100%         

  - Installing yiisoft/yii2-swiftmailer (2.0.5)
    Loading from cache

  - Installing yiisoft/yii2-codeception (2.0.5)
    Loading from cache

  - Installing bower-asset/bootstrap (v3.3.5)
    Loading from cache

  - Installing yiisoft/yii2-bootstrap (2.0.6)
    Loading from cache

  - Installing yiisoft/yii2-debug (2.0.6)
    Loading from cache

  - Installing bower-asset/typeahead.js (v0.11.1)
    Loading from cache

  - Installing phpspec/php-diff (v1.1.0)
    Loading from cache

  - Installing yiisoft/yii2-gii (2.0.5)
    Loading from cache

  - Installing fzaninotto/faker (v1.5.0)
    Loading from cache

  - Installing yiisoft/yii2-faker (2.0.3)
    Loading from cache

fzaninotto/faker suggests installing ext-intl (*)
Writing lock file
Generating autoload files

 

执行完成上面的,yii2就下载好了,我们需要初始化

4. yii 高级模板初始化

进入yii-application目录(上面用composer安装的目录),执行:

./init

执行log如下:

[root@iZ942k2d5ezZ yii-application]# ./init
Yii Application Initialization Tool v1.0

Which environment do you want the application to be initialized in?

  [0] Development
  [1] Production

  Your choice [0-1, or "q" to quit] 0

  Initialize the application under 'Development' environment? [yes|no] yes

  Start initialization ...

   generate common/config/main-local.php
   generate common/config/params-local.php
   generate frontend/config/main-local.php
   generate frontend/config/params-local.php
   generate frontend/web/index.php
   generate frontend/web/index-test.php
   generate console/config/main-local.php
   generate console/config/params-local.php
   generate backend/config/main-local.php
   generate backend/config/params-local.php
   generate backend/web/index.php
   generate backend/web/index-test.php
   generate tests/codeception/config/config-local.php
   generate yii
   generate cookie validation key in backend/config/main-local.php
   generate cookie validation key in frontend/config/main-local.php
      chmod 0777 backend/runtime
      chmod 0777 backend/web/assets
      chmod 0777 frontend/runtime
      chmod 0777 frontend/web/assets
      chmod 0755 yii
      chmod 0755 tests/codeception/bin/yii

  ... initialization completed.

[root@iZ942k2d5ezZ yii-application]# 

到这里就安装了yii2高级模板的安装,配置nginx

前台地址:frontend/web

后台地址:backend/web

访问的时候,在linux下面需要将web目录下面的assets文件夹设置成可写。

这样就完成了yii2 advanced的安装了

 

linux 安装mysql5.6

Linux:Centos

1.先查看系统上有没有安装了旧版本的MySQL ,用下面的命令:

rpm -qa | grep mysql

如果有,用以下命令卸载

rpm -e --nodeps 上步显示mysql名称

安装编译mysql 需要的依赖包

yum install  libevent*  libtool* autoconf* libstd* ncurse* bison* openssl*  
yum -y install gcc gcc-c++

2.安装cmake,mysql5.5之后需要用cmake支持编译安装,下载安装cmake

wget http://www.cmake.org/files/v2.8/cmake-2.8.12.1.tar.gz  
tar -xf cmake-2.8.12.1.tar.gz  
cd cmake-2.8.12.1  
./configure && make && make install  

检查cmake安装好了没

cmake --version

3.下载mysql

wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.14.tar.gz  
tar xvf mysql-5.6.14.tar.gz  
cd mysql-5.6.14

上面如果下载失败,可以到这里下载:http://download.csdn.net/detail/terry_water/6973721

4.编译安装

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
make && make install

如果在上面的编译报错,Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH),则使用下面的编辑代码:

cmake -DCURSES_LIBRARY=/usr/lib/libncurses.so -DCURSES_INCLUDE_PATH=/usr/include  -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci

 

要很长时间的等待,我虚拟机中安装是双核2G内存,花了20分钟左右的。

另外还可能遇到下面的错误:

1.

yum install  libevent*  libtool* autoconf* libstd* ncurse* bison* openssl*

报错:
libevent2-devel conflicts with libevent-devel-1.4.13-4.el6.x86_64

则执行:

yum install  libevent2  libtool* autoconf* libstd* ncurse* bison* openssl*

2.
查看 ls /usr/lib/libncurses.so
如果找不到,则
find / -name ‘libncurses.so’
我找到的文件如下:
/usr/lib64/libncurses.so
增加快捷方式

ln -s /usr/lib64/libncurses.so  /usr/lib/libncurses.so

5.配置mysql

groupadd mysql  
useradd -g mysql mysql

 

chown -R mysql:mysql /usr/local/mysql

初始化配置

cd /usr/local/mysql  
scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql

配置自启动和启动mysql

cp support-files/mysql.server /etc/init.d/mysql  
chkconfig mysql on  
service mysql start

配置PATH

vi /etc/profile  
#在文件末尾添加  
PATH=/usr/local/mysql/bin:$PATH  
export PATH  
#保存退出,生效配置  
source /etc/profile

登陆mysql 并设置root密码

mysql -uroot  
mysql> SET PASSWORD = PASSWORD('123456');  
设置mysql可以远程访问  
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

如果是远程,配置可以远程访问,配置防火墙,允许3306端口

/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT  
/etc/rc.d/init.d/iptables save

6.数据库定时备份:

mkdir /backup  
chmod 777 -R /backup
vim /backup/mysql_backup.sh

写入如下内容:-p引号里面是数据库的密码,erp是备份的数据库名字

#!/bin/bash  
date=$(date +%Y%m%d)  
/usr/local/mysql/bin/mysqldump -h localhost -uroot -p'Ddsd#$#2s$!s4343%$^&s' erp > /backup/databases-$date.sql

设置CRON,定时备份:

crontab -e   
00 06 * * * /bin/bash /backup/mysql_backup.sh

 

 

 

Yii2 DWZ JUI 扩展 插件

本人写的一个YII2 DWZ整合的后台账户管理,菜单权限控制,日志管理,缓存管理的的admin UI.欢迎下载:

Yii2 Fancy Ecommerce ADMIN (FEC ADMIN)

DEMO: http://demo.fancyecommerce.com/

测试账户: admin admin123(密码)

下面是github部分的内容,欢迎下载!

github: https://github.com/fancyecommerce/yii2_fec_admin/


作者 :Terry

作者QQ : 2358269014

作者Email : 2358269014@qq.com


有任何建议或者需求欢迎来反馈 issues

欢迎点击右上方的 star 收藏

fork 参与开发,欢迎提交 Pull Requests,然后 Pull Request


1、安装

安装这个扩展的首选方式是通过 composer.

执行

composer require --prefer-dist fancyecommerce/fec_admin

或添加

"fancyecommerce/fec_admin": "~1.3.3"  
composer install

 

2、配置

配置:在原来的基础上添加如下代码:main.php

'modules'=>[  
        'fecadmin' => '\fecadmin\Module',  
    ],  
 'components' => [  
       'user' => [  
            'identityClass' => 'fecadmin\models\AdminUser',  
            'enableAutoLogin' => true,  
        ],  
        'urlManager' => [  
                'class' => 'yii\web\UrlManager',  
                'enablePrettyUrl' => true,  
                'showScriptName' => false,  
                'rules' => [  
                    '' => 'fecadmin/index/index',  
                    //'blog' => 'blog/index/index',  
  
                ],  
            ],  
        ],

param设置:config/param.php

<?php  
return [  
    'theme'             =>  'default',  
    'systemlog'         => [  
                    'enable' => true,  
                ],  
];