YII框架入門

1、安裝php

php運行環境安裝包:http://www.phpstudy.net/a.php/207.htmlhtml

Yii安裝包:mysql

https://github.com/yiisoft/yii2/releases/download/2.0.6/yii-basic-app-2.0.6.tgz (Yii2的基本應用程序模板)git

https://github.com/yiisoft/yii2/releases/download/2.0.6/yii-advanced-app-2.0.6.tgz (Yii2的高級應用程序模板)github

下載 Yii2的基本應用程序模板 完畢後解壓到網站根目錄。web

個人網站根目錄是:F:\testyiisql

域名是:www.testyii.com數據庫

訪問 http://www.testyii.com/requirements.php 檢查安裝環境。api

注意php版本必須是5.4以上。數組

配置cookie驗證密鑰: 文件 F:\testyii\config\web.php 裏面有個 cookieValidationKey 項 隨便給個abcd字符便可

訪問 http://www.testyii.com/web/index.php 看到 Congratulations! 表示安裝完畢了。

2、控制器

控制器文件地址:F:\testyii\controllers

建立格式:

<?php
namespace app\controllers; //控制器的命名空間

use yii\web\Controller; //控制器繼承的 Controller 類的命名空間
use \YII; //框架全局類的命名空間

class TestController extends Controller //控制器命名格式 名稱Controller 駝峯法命名 文件名(TestController.php)與類名一致 
{
    public function actionIndex() { //操做命名格式 action操做名
        echo 'hello word';
    }
}

 訪問格式:請求入口?r=控制器名/操做名

例如:http://www.testyii.com/web/index.php?r=test/index

注意訪問這裏的控制器名與操做名不區分大小寫。

控制器父類源代碼是 F:\testyii\vendor\yiisoft\yii2\web\Controller.php

控制能夠使用父類的public方法和屬性 例如使用跳轉方法 redirect($url, $statusCode = 302)

3、接收變量

<?php
namespace app\controllers; //控制器的命名空間

use yii\web\Controller; //控制器繼承的 Controller 類的命名空間
use \YII; //框架全局類的命名空間

class TestController extends Controller //控制器命名格式 名稱Controller 駝峯法命名 文件名(TestController.php)與類名一致 
{
    public function actionIndex() { //操做命名格式 action操做名
        $request = YII::$app->request; //經過全局類 YII 獲得請求組件 $request
        $id = $request->get('id','default'); //經過請求組件的get方法獲得GET傳遞過來的數據
        echo $id; //若是傳遞了 id 則輸出id 沒有傳遞 則輸出 default
    }
}

 

請求組件的源代碼是 F:\testyii\vendor\yiisoft\yii2\web\Request.php

裏面有不少方法可供使用 例如接受POST變量的 post 方法

3、SESSION 處理

<?php
namespace app\controllers; //控制器的命名空間

use yii\web\Controller; //控制器繼承的 Controller 類的命名空間
use \YII; //框架全局類的命名空間

class TestController extends Controller //控制器命名格式 名稱Controller 駝峯法命名 文件名(TestController.php)與類名一致 
{
    public function actionIndex() { //操做命名格式 action操做名
        $session = YII::$app->session; //獲得session組件 $session
        $session->open(); //開啓session
        $session['name'] = '張三'; //寫入session
        $name = $session['name']; //讀取session
        unset($session['name']); //刪除session中的某個值
        $session->destroy(); //銷燬session
        echo $name;
    }
}

上面的代碼中,我經過YII全局類獲得$session組件,這個組件是一個對象,可是緊接着我卻把它看成數組進行操做。是由於session組件實現了php內置的ArrayAccess接口。

session組件的源碼是:F:\testyii\vendor\yiisoft\yii2\web\Session.php

4、COOKIE 處理

<?php
namespace app\controllers; //控制器的命名空間

use yii\web\Controller; //控制器繼承的 Controller 類的命名空間
use \YII; //框架全局類的命名空間
use yii\web\Cookie;

class TestController extends Controller //控制器命名格式 名稱Controller 駝峯法命名 文件名(TestController.php)與類名一致 
{
    public function actionIndex() { //操做命名格式 action操做名
        //獲得響應組件裏面的cookies對象
        $cookies = YII::$app->response->cookies; 
        //等待寫入的cookie數據
        $cookie_1 = array('name'=>'age','value'=>18); 
        $cookie_2 = array('name'=>'gender','value'=>'male');
        //add方法接受一個Cookie類生成的對象
        $cookies->add(new Cookie($cookie_1)); //寫入cookie
        $cookies->add(new Cookie($cookie_2)); 
        echo $cookies['age']; //讀取cookie
        unset($cookies['age']); //刪除cookie
    }
}

 

注意這裏的代碼又 use 了一個命名空間。

Cookie類的源碼是:F:\testyii\vendor\yiisoft\yii2\web\Cookie.php

從源碼中可看到,等待寫入cookie的數組,除了name value 外 還能夠有 domain expire path secure httpOnly 等數據

響應組件裏面的cookies對象的生成類源碼:F:\testyii\vendor\yiisoft\yii2\web\CookieCollection.php

從源碼中能夠看到 它有個 getValue($name, $defaultValue = null) 方法也很實用。

5、數據模型

 準備兩張表:

CREATE TABLE `user` (
  `uid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶ID',
  `uname` varchar(20) NOT NULL DEFAULT '' COMMENT '用戶名',
  `upass` varchar(50) NOT NULL DEFAULT '' COMMENT '密碼',
  PRIMARY KEY (`uid`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用戶表';

CREATE TABLE `log` (
  `log_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL DEFAULT '0' COMMENT '操做者id',
  `content` varchar(8000) NOT NULL DEFAULT '' COMMENT '操做內容',
  `create_time` int(11) NOT NULL DEFAULT '0' COMMENT '建立時間',
  PRIMARY KEY (`log_id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用戶操做日誌表';

 

配置Yii鏈接數據庫的信息:F:\testyii\config\db.php

<?php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=test', //指定數據庫
    'username' => 'root',
    'password' => 'root',
    'charset' => 'utf8',
];

 

模型文件地址:F:\testyii\models

建立模型:

文件夾 F:\testyii\models 下有個 User.php 與我剛纔建立的User表名字有衝突,我把它作個備份,而後建立一個新的 User.php

模型的名字與類名字與表名字保持一致。

<?php
namespace app\models; //模型必須放在 這個命名空間中

use yii\db\ActiveRecord; //模型繼承的類的命名空間

class User extends ActiveRecord {

}

 

ActiveRecord 類的源碼地址:F:\testyii\vendor\yiisoft\yii2\db

使用模型之插入數據:

插入表單以前我先在模型中建立一個驗證規則,更多關於驗證器的信息 http://www.yiichina.com/doc/guide/2.0/tutorial-core-validators

<?php
namespace app\models; //模型必須放在 這個命名空間中

use yii\db\ActiveRecord; //模型繼承的類的命名空間

class User extends ActiveRecord {
    public function rules() {
        return [
            [['uname', 'upass'], 'trim'], //去掉空格
            [['uname', 'upass'], 'required'], //必須填寫
            ['uname', 'string', 'min'=>5, 'max'=>20 ], //限制字符長度
            ['upass', 'string', 'min'=>6, 'max'=>50 ],
        ];
    }
}

 

再回到控制器中,使用user模型插入數據

<?php
namespace app\controllers; //控制器的命名空間

use yii\web\Controller; //控制器繼承的 Controller 類的命名空間
use \YII; //框架全局類的命名空間
use app\models\User;

class TestController extends Controller //控制器命名格式 名稱Controller 駝峯法命名 文件名(TestController.php)與類名一致 
{
    public function actionIndex() { //操做命名格式 action操做名
        $user = new User; //實例化模型對象
        $user->uname = 'zhangsan'; //待插入的數據
        $user->upass= '888888';
        //驗證數據 成功返回 true 失敗 返回 false
        if(!$user->validate()) die('error');
        $uid = $user->save(); //插入數據
        $uid = $user->attributes['uid']; //獲得自增id
        echo $uid;
    }
}

 

使用模型之查找數據:

<?php
namespace app\controllers; //控制器的命名空間

use yii\web\Controller; //控制器繼承的 Controller 類的命名空間
use \YII; //框架全局類的命名空間
use app\models\User;

class TestController extends Controller //控制器命名格式 名稱Controller 駝峯法命名 文件名(TestController.php)與類名一致 
{
    public function actionIndex() { //操做命名格式 action操做名
        $user = new User; //實例化模型對象
        //1.執行一條查詢語句
        $sql = "select * from user";
        $results = $user->findBySql($sql)->all(); //all方法返回一個二維數組  one方法返回一維數組
        $one_user = $results[0]->attributes(); //獲得一條記錄的全部數據
        $one_user_name = $results[0]->uname; //獲得一條記錄的某個值
        //print_r($one_user);
        //print_r($one_user_name);
        
        //2.查詢一條記錄
        $results = User::find()->where(['uid' => 1])->one()->toArray(); //這裏直接返回了數組格式
        print_r($results);
    }
}

 

關於更多的查詢信息 http://www.yiichina.com/doc/api/2.0/yii-db-activerecord

使用模型之修改數據:

<?php
namespace app\controllers; //控制器的命名空間

use yii\web\Controller; //控制器繼承的 Controller 類的命名空間
use \YII; //框架全局類的命名空間
use app\models\User;

class TestController extends Controller //控制器命名格式 名稱Controller 駝峯法命名 文件名(TestController.php)與類名一致 
{
    public function actionIndex() { //操做命名格式 action操做名
        $user_obj = User::findOne(1); //獲得主鍵uid爲1的數據的對象
        $user_obj->upass = 111111; //修改密碼        if ($user_obj->update() !== false) {
            echo 'update successful';
        } else {
            echo 'update failed';
        }
    }
}

 

使用模型之刪除數據:

<?php
namespace app\controllers; //控制器的命名空間

use yii\web\Controller; //控制器繼承的 Controller 類的命名空間
use \YII; //框架全局類的命名空間
use app\models\User;

class TestController extends Controller //控制器命名格式 名稱Controller 駝峯法命名 文件名(TestController.php)與類名一致 
{
    public function actionIndex() { //操做命名格式 action操做名
        $user_obj = User::findOne(1); //獲得主鍵uid爲1的數據的對象
        if ($user_obj->delete() !== false) {
            echo 'delete successful';
        } else {
            echo 'delete failed';
        }
    }
}

 

使用模型之關聯查詢:

下面演示用戶表關聯用戶日誌表的關聯操做。

給log表插入兩條記錄

INSERT INTO `log` VALUES ('1', '2', '呵呵', '10');
INSERT INTO `log` VALUES ('2', '2', '哈哈', '20');

 

再建立一個日誌模型 F:\testyii\models\Log.php。

<?php
namespace app\models; //模型必須放在 這個命名空間中

use yii\db\ActiveRecord; //模型繼承的類的命名空間

class Log extends ActiveRecord {
    
}

 

再回到控制器中

<?php
namespace app\controllers; //控制器的命名空間

use yii\web\Controller; //控制器繼承的 Controller 類的命名空間
use \YII; //框架全局類的命名空間
use app\models\User;
use app\models\Log;


class TestController extends Controller //控制器命名格式 名稱Controller 駝峯法命名 文件名(TestController.php)與類名一致 
{
    public function actionIndex() { //操做命名格式 action操做名
        //一對多關係的查詢
        $user_obj = User::findOne(2);
        $logs = $user_obj->hasMany('app\models\Log',['uid'=>'uid'])->asArray()->all(); //第一個uid是 log表的 第二個uid是user表的
        //print_r($logs);
        //一對一關係的查詢
        $log_obj = Log::findOne(1);
        $user = $log_obj->hasOne(User::className(),['uid'=>'uid'])->asArray()->one(); //這段代碼最好放在 Log 模型裏面
        print_r($user);
    }
}

 

6、視圖

視圖文件地址:F:\testyii\views\控制器名\視圖名.php

建立視圖:F:\testyii\views\test\index.php

<?=$name?>
<?=$age?>
<?=print_r($age)?>

 

調用視圖:

<?php
namespace app\controllers; //控制器的命名空間

use yii\web\Controller; //控制器繼承的 Controller 類的命名空間
use \YII; //框架全局類的命名空間



class TestController extends Controller //控制器命名格式 名稱Controller 駝峯法命名 文件名(TestController.php)與類名一致 
{
    public function actionIndex() { //操做命名格式 action操做名
        $result = array('name'=>'張三','age'=>18,'arr'=>array('a','b'));
        return $this->renderPartial('index',$result); //調用視圖 並把變量注入到視圖中
    }
}

 

視圖中安全輸出數據:

<?php
    use yii\helpers\Html; //轉義
    use yii\helpers\HtmlPurifier; //過濾
?>
<?=Html::encode($name)?>
<?=HtmlPurifier::process($name)?>

 

關於視圖的更多信息 http://www.yiichina.com/doc/guide/2.0/structure-views