在肯定了模塊化開發應用的方向後,能夠嘗試寫一個模塊練練手啦。首先想到的就是用戶模塊。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組件封裝全部數據庫操做,若是未來須要進行分佈式部署,只須要重寫這部分的操做就能夠了。模塊化