Yii 簡明學習教程

Yii是一個基於組件的高性能PHP框架,用於快速開發Web應用程序(下面內容基於Yii 1.1)php

1. 典型的工做流

請求聲明週期圖

  1. 用戶向入口腳本index.php發起請求
  2. 入口腳本加載應用配置config.php並建立一個應用主體
  3. 應用主體經過請求組件Request解析請求的路由
  4. 根據解析結果去建立控制器實例去處理請求
    ——————————————————————————————————————
  5. 控制器建立一個動做實例並針對操做執行過濾器
  6. 若任一過濾器返回失敗,則動做取消
  7. 若全部過濾器返回成功,則動做執行
  8. 動做加載一個數據模型,可能會從數據庫中讀取數據
  9. 動做將渲染的視圖,並加載的數據模型做爲屬性傳遞給它
  10. 渲染結果返回給響應組件Response
  11. 響應組件發送渲染結果給用戶瀏覽器

2. 入口腳本index.php

<?php
    /// 定義全局變量,在生產環境中請刪除此行
    defined('YII_DEBUG') or define('YII_DEBUG',true);
    // 包含Yii引導文件
    require_once('path/to/yii/framework/yii.php');
    // 讀取配置文件
    $configFile='path/to/config/file.php';
    // 建立一個應用實例並執行
    Yii::createWebApplication($configFile)->run();
?>

3. 應用配置config.php

應用主體的相關配置,能夠內部屬性能夠經過Yii::app()->attributeName訪問mysql

<?php
$config = [
    'id' => 'basic',  //應用主體ID
    'basePath' => dirname(__DIR__), //應用的根路徑
    'language' => 'zh-CN',  //網頁語言
    'defaultRoute' => 'post/index',  //默認路由
    'components' => [   //註冊組件
        'db'=>array(
            'class' => 'system.db.CDbConnection',
            'connectionString' => 'mysql:host=mysql56.rdsm1whs0okm6y4.rds.bj.baidubce.com;dbname=crowd_test',
            'emulatePrepare' => true,
            'username' => 'crowdtest',
            'password' => 'unittest_sdcqa',
            'charset' => 'utf8',
        ),
        'fixture' => array(
            'class' => 'crowdtest.tests.test.CDbFixtureManager',
            'basePath' => dirname(__FILE__) . '/../fixtures/',
        ),
    ]
];

return $config;
?>

4. 模型Model

模型是MVC架構中的M,由CModel或其子類(如CActiveRecord、CFormModel)繼承而來,是表現業務數據、規則和邏輯的對象,表單模型(CFormModel)用於保持從用戶的輸入獲取的數據, 這些數據常常被獲取,使用,而後丟棄。Active Record (AR) 是一種用於經過面向對象的風格抽象化數據庫訪問的設計模式。sql

<?php
    class ContactForm extends CFormModel
    {
        //【業務數據】
        public $name;
        public $email;
        public $verifyCode;
        //【業務規則】
        // array('AttributeList', 'Validator', 'on'=>'ScenarioList', ...附加選項)
        // Validator: required,email,length,captcha,url,boolean等等
        public function rules(){
            return array(
                    array('name,email','required'),
                    array('email','email'),
                    array('name', 'length', 'min'=>3, 'max'=>12),
                    array('verifyCode','captcha'),
                );
            ];
        }
        //屬性在頁面中的顯示內容
        public function attributeLabels()
        {
            return array(
                'name' => '姓名'
            );
        }
        //【業務邏輯】
        public function contact($email){
        }
    }
?>

5. 數據庫操做(DAO/ActiveRecord)

數據訪問對象(DAO) 對訪問存儲在不一樣數據庫管理系統(DBMS)中的數據提供了一個通用的API。數據庫

$connection=Yii::app()->db;//CDbConection實例,表明一個數據庫鏈接
    $command=$connection->createCommand($sql)  //CDbCommand實例,表明Sql指令
    $command->bindValue();  //綁定變量
    $command->query();  //執行查詢
    $command->queryRow(); //執行查詢並返回結果中的第一行
    $command->execute(); //執行操做,刪除、新增等

Active Record(AR)是一個流行的對象-關係映射(ORM)技術,經過面向對象的方式來操縱數據庫,大大提升了代碼的可維護性,每一個 AR類表明一個數據表,數據表的列在 AR 類中體現爲類的屬性,一個 AR 實例則表示表中的一行。設計模式

<?php
    class User extends CActiveRecord
    {
        //Required,返回一個此類可調用的實例
        public static function model($className=__CLASS__)
        {
            return parent::model($className);
        }
        //設置數據庫中對應的數據表
        public function tableName()
        {
            return 'tbl_post';
        }
        //不一樣表之間的關聯關係
        //BELONGS_TO 屬於 1:n
        //HAS_MANY  有多個  m:1
        //HAS_ONE   有一個  1:1
        //MANY_MANY 多對多  m:n
        public function relations(){
            return array(
                'article'=>array(self::HAS_MANY, 'Article', 'user_id'),
            );
        }
        public function myfunc(){
            //CURD
        }
    }
?>
  • 增長(Create)api

    <?php
        $model = new User();
        $model->name = "Lee";
        $model->age = "18";
        //save中會自動執行rules中的規則檢查,根據檢查結果返回true或者false
        if($model->save()){
              #code
        }
    ?>
  • 查詢(research)瀏覽器

<?php
    // 查找知足指定條件的結果中的第一行
    $user=User::model()->find($condition,$params);
    $user = User::model()->find("name=:name",array(':name'=>$name));
    // 查找具備指定主鍵值的那一行
    $user=User::model()->findByPk($userID,$condition,$params);
    // 查找具備指定屬性值的行
    $user=User::model()->findByAttributes($attributes,$condition,$params);
    // 經過指定的 SQL 語句查找結果中的第一行
    $user=User::model()->findBySql($sql,$params);

    //經過構建CDbCriteria實例完成更復雜的操做
    $criteria=new CDbCriteria;
    $criteria->select='email';  // 只選擇 'email' 列
    $criteria->condition='user_id=:user_id';
    $criteria->params=array(':user_id'=>$id);
    $user=User::model()->find($criteria); // $params 不須要了
?>
  • 更新(update)
<?php
    $user=User::model()->findByPk(3);
    $user->username='newName';
    $user->save(); // 將更改保存到數據庫
?>
  • 刪除(Delete)
<?php
    $user=User::model()->findByPk(10); // 假設有一個用戶,其 ID 爲 10
    $user->delete(); // 從數據表中刪除此行

    User::model()->deleteAll("type='test'");
?>
  • 關聯查詢
<?php
    //懶加載,使用該屬性再取回
    $user=User::model()->findByPk(1);
    $user->article;
    //渴求加載,一次性取回
    $user=User::model()->with('article')->findAll();
?>

6. 控制器Controller

控制器是MVC中的C,由CController繼承而來,負責處理請求以及生成響應,一個控制器的聲明週期以下:session

st=>start: 建立Controller實例
e=>end: 結束
op0=>operation: 執行CController:init()方法
op1=>operation: 肯定操做ID建立操做(默認操做/獨立操做/內聯操做/異常)
op2=>operation: 依次調用應用主體、模塊、控制器的beforeAction()方法
op3=>operation: 控制器執行操做(請求數據解析和填入到操做參數)
op4=>operation: 依次調用應用主體、模塊、控制器的afterAction()方法
op5=>operation: 應用主體獲取操做結果並賦值給響應

st->op0->op1->op2->op3->op4->op5->e

一個簡單的控制器文件以下所示,主要由執行過濾和一系列動做組成。架構

<?php
    Class SiteController extend CController{
        //執行過濾
        public function filters(){...}
        //指定一些通用的action
        public function actions(){...}
        public function actionIndex(){...}
        public function actionLogin(){...}
        public function actionContact()
        {
            //設置對應layout佈局,不須要時將該值設爲false,默認view/layouts/main.php
            $this->layout = 'newLayout';
            //構建模型實例
            $model = new ContactForm();
            //根據POST的內容渲染視圖
            if ($model->load(Yii::app()->request->post()) && $model->contact(Yii::app()->params['adminEmail'])) {
                Yii::$app->session->setFlash('contactFormSubmitted');
                return $this->refresh();
            }
            return $this->render('contact', [
                'model' => $model,
            ]);
        }
    }
?>

7. 視圖View

視圖是MVC架構中的V,用於展現從數據到終端用戶的代碼app

視圖方面推薦Smarty3,比原生View要簡潔高效不少,相關教程後續加上。

Reference:
http://www.yiiframework.com/doc/guide/1.1/zh_cn/index
http://www.yiichina.com/doc/api/1.1

博文做者:vicfeel
博文出處:http://www.cnblogs.com/vicfeel 本文版權歸做者和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文連接,謝謝合做! 若是閱讀了本文章,以爲有幫助,您能夠爲個人博文點擊「推薦一下」!

相關文章
相關標籤/搜索