在肯定了模块化开发应用的方向后,能够尝试写一个模块练练手啦。首先想到的就是用户模块。php
一般一个应用会存在前台用户和后台用户,这两个用户的Session变量必须是分开的,否则就乱套了。所以,天然地想到用两个组件来分别控制前台用户和后台用户,分别是web
Yii2 对用户Session的存储与Yii1不一样,原来适用于Yii1的先后台分类的方式,再也不适用于Yii2,不过稍作修改就能够了,web.php里的相关代码片断以下:数据库
<!-- lang: php --> 'user' => [ // Webuser for the frontend 'class' => '\yii\web\User', 'loginUrl' => array('/user/login/member'), 'identityClass' => 'app\modules\user\models\MemberIdentify', 'idParam' => '_mId', 'identityCookie' => ['name'=>'_ff','httpOnly' => true], ], 'adminUser' => array( // Webuser for the admin area (admin) 'class' => '\yii\web\User', 'loginUrl' => array('/user/login/admin'), 'identityClass' => 'app\modules\user\models\AdminIdentify', 'idParam' => '_aId', 'identityCookie' => ['name'=>'_aa','httpOnly' => true], ),
关键点在于idParam, 须要设置不一样。缓存
数据表设计遵循的原则是:app
安装这两个原则,增长一个Migration, 具体的内容以下:frontend
<!-- lang: php --> $this->createTable('{{member}}', [ 'id' => 'pk', 'username' => 'varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL', 'password' => 'varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL', 'source'=>'int unsigned not null', 'create_time'=>'int unsigned not null', ],'ENGINE InnoDB DEFAULT CHARSET utf8 PARTITION BY RANGE (id) ( PARTITION p0 VALUES LESS THAN (3), PARTITION p1 VALUES LESS THAN (6), PARTITION p2 VALUES LESS THAN (9), PARTITION p3 VALUES LESS THAN (12), PARTITION p4 VALUES LESS THAN MAXVALUE )' );
借助MySQL的表分区功能,以id为基础进行表分区。为了最大化利用查询缓存,减小表更新操做的影响,这里把一般用户表会有的last_visited, update_time等移到另一个表里,从而保证在反复查询用户验证信息时,能利用MySQL的查询缓存。yii
用户模块的两个主控制器,登录控制器和登出控制器,处理全部的用户登陆登出逻辑,以LoginController为例,包含的action包括:分布式
根据上述的设计方案,目录结构以下:ide
从扩展上考虑,UserService组件封装全部数据库操做,若是未来须要进行分布式部署,只须要重写这部分的操做就能够了。模块化