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 本文版权归做者和博客园共有,欢迎转载,但须保留此段声明,并给出原文连接,谢谢合做! 若是阅读了本文章,以为有帮助,您能够为个人博文点击“推荐一下”!

相关文章
相关标签/搜索