一、数据库连接
1、配置连接参数
在database.php里面开启:
'db' => array( 'connectionString' => 'mysql:host=127.0.0.1;dbname=blog', 'emulatePrepare' => true, // PDO扩展 'username' => 'root', 'password' => '', 'charset' => 'utf8', 'tablePrefix' => 'yii_', // 表前缀 'enableParamLogging' => true // 开启SQL调试信息 ),
更多配置在 framework/db/CDbConnection.php中 可以找到
2、测试连接
用 var_dump(Yii::app()->db);可以测试数据库是否连接成功
二、定义模型与查询数据
1、定义模型
位置:protected/models/
名称:admin.php
内容:模型必须有两个方法 —— model() 与 tableName(),如下。
class Admin extends CActiveRecord{ // 必需方法1。返回模型 public static function model($className = __CLASS__){ return parent::model($className); } // 必须方法2。返回表名 public function tableName(){ return "{{admin}}"; //返回yii_admin表名 } }
2、查询
举个栗子,在控制器中调用用户信息:
Admin::model()->find('username = :name' , array(':name => 'admin'));
对于返回的数据,建议打印出来看一下,方便操作每个字段。
注意:Yii的 ActiveRecord 基类模型采用了对象化,表映射到模型,记录映射到对象,表或记录的字段映射到模型或对象的属性,所以用访问属性的方法可以访问到字段。
三、登录验证
将操作以下两个文件:
protected/models/LoginForm.php
protected/components/UserIdentity.php
参照源码进行修改即可。
1、控制器中执行:
$loginForm = new LoginForm();
$loginForm()->login(); // 进行登录验证
注意:LoginForm 是 Yii 默认带有的一个登录模型,这个模型可以对登录表单进行验证,可以修改为映射到后台用户表的 admin 模型,强迫症可以改为 admin.php,实例化的时候 new Admin() 就行。
/** * 登录视图及登录表单处理 * @return [type] [description] */ public function actionIndex(){ $loginForm = new LoginForm(); // 实例化LoginForm // 登录表单处理 if(isset($_POST['LoginForm'])){ $loginForm->attributes = $_POST['LoginForm']; // 压入需要验证的POST数据 if($loginForm->validate() && $loginForm->login()){ //验证通过 Yii::app()->session['logintime'] = time(); //写session,记录当前登录时间 $this->redirect(array('default/index')); } } $this->render('index', array('loginForm' => $loginForm)); //渲染模板(没有布局),分配模板变量loginForm模型 }
2、在 LoginForm模型中,rules() 方法定义规则:
public function rules() { return array( array('password', 'authenticate'), //自定义 authenticate()方法验证 ); } public function authenticate($attribute, $params) { if(!$this->hasErrors()) { $this->_identity = new UserIdentity($this->username, $this->password); if(!$this->_identity->authenticate()) $this->addError('password','用户名或密码错误'); } }
3、UserIdentity 类进行判断与返回错误
这是它的authenticate()方法,辅助上面LoginForm模型中的authenticate()方法进行密码验证
public function authenticate() { $user= User::model()->find('username = :name', array(':name' => $this->username)); if(!$user){ // 用户名错误 $this->errorCode = self::ERROR_USERNAME_INVALID; } else if($user->password != md5($this->password)){ // 密码错误 $this->errorCode = self::ERROR_PASSWORD_INVALID; } else{ $this->errorCode = self::ERROR_NONE; // 验证通过 } return !$this->errorCode; // 真通过,假失败 }
四、登录信息调取
Yii::app()->user->name; // 登录后存储在 session 中的用户名
注意前后台用户区分,需要设置:(以后台模块 admin 为例)
在 modules/admin/AdminModule.php 文件中的 init() 方法添加代码:
Yii:app()->setComponents(array( 'user' => array('stateKeyPrefix' => 'admin') ));
五、Session使用
存储:
Yii::app()->session['logintime'] = time();
调用:
Yii::app()->session['logintime']
清除:
Yii::app()->session->clear();
Yii::app()->session->destory();
退出登录:
Yii::app()->user->logout(); //退出登录,清除SESSION
六、URL跳转与生成
URL跳转:
$this->redirect(array('控制器名/方法名'));
URL生成:
在视图中调用,$this->createUrl('控制器/方法', array('id' => 2));