Yii是一个基于组件的高性能PHP框架,用于快速开发Web应用程序(下面内容基于Yii 1.1)

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访问

<?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) 是一种用于通过面向对象的风格抽象化数据库访问的设计模式。

<?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)

    <?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继承而来,负责处理请求以及生成响应,一个控制器的声明周期如下:

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,用于展示从数据到终端用户的代码

视图方面推荐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

本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!

如果阅读了本文章,觉得有帮助,您可以为我的博文点击“推荐一下”!

Yii 简明学习教程的更多相关文章

  1. WebPack 简明学习教程

    WebPack 简明学习教程 字数1291 阅读22812 评论11 喜欢35 WebPack是什么 一个打包工具 一个模块加载工具 各种资源都可以当成模块来处理 网站 http://webpack. ...

  2. YII Framework学习教程-YII的Model-开发规范-路径别名-命名空间

    到这里,大概的YII开发已经基本可以,但是下面要将的所有课程,学完之后可以让你更爱YII.下面的教程是讲的MVC的M,model.数据,业务,代码的集中地区.所以开始之前,学学开发规范-路径别名-命名 ...

  3. YII Framework学习教程-YII的异常处理

    异常无处不在,作为程序员,活着就是为了创造这些异常,然后修复这些异常而存在的.YII框架封装了PHP的异常,让异常处理起来更简单. 使用 YII处理错误和异常的配置方法: 你可以在入口文件中定义YII ...

  4. (转)JMS简明学习教程

    转:http://www.cnblogs.com/jjj250/archive/2012/08/08/2628552.html 基础篇 JMS是应用系统或组件之间相互通信的应用程序接口,利用它,我们可 ...

  5. YII Framework学习教程-YII的日志

    日志的作用(此处省略1000字) YII中的日志很好很强大,允许你把日志信息存放到数据库,发送到制定email,存放咋文件中,意见显示页面是,甚至可以用来做性能分析. YII中日志的基本配置:/yii ...

  6. YII Framework学习教程-YII的安全

    web应用的安全问题是很重要的,在“黑客”盛行的年代,你的网站可能明天都遭受着攻击,为了从某种程度上防止被攻击,YII提供了防止攻击的几种解决方案.当然这里讲的安全是片面的,但是值得一看. 官方提供的 ...

  7. YII Framework学习教程-YII的国际化

    一个web应用,发布到互联网,就是面向全球用户.用户在世界的各个角落都可以访问到你的web应用,当然要看你的网站和不和谐,不和谐的web应用在和谐社会是不让你访问的. YII提供了国际化的支持,可以让 ...

  8. notes for python简明学习教程(2)

    方法是只能被该类调用的函数 print函数通常以换行作为输出结尾 字典的items方法 返回的是元组列表 即列表中的每个元素都是元组 切片左闭右开 即开始位置包含在切片中 结束位置不在 每一个对象都能 ...

  9. notes for python简明学习教程(1)

    print总是以(\n)作为结尾,不换行可以指定一个空 end='' 字符串前面+r, 原始字符串 \ 显示行连接 input()函数以字符串的形式 返回键入的内容 函数参数, 有默认值的形参要放在形 ...

随机推荐

  1. Spring MVC POJO入参过程分析

    SpringMVC确定目标方法POJO类型的入参过程 1.确认一个key: (1).若目标方法的POJO类型的参数没有使用@ModelAttribute作为修饰,则key为POJO类名第一个字母的小写 ...

  2. MSBuild问题积累

    我想要当属性ConfigurationType定义为StaticLibrary时,将其重新定义为StaticLibrary,按照以下来做,实现不了. <ConfigurationType> ...

  3. 跟我一起写Makefile(五)

    使用变量———— 在Makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在Makefile中执行的时候其会自动原模原样地展开在所使用的地方.其与C/C++所不同的是, ...

  4. Spring.Net 入门学习(一)实现控制器翻转与依赖注入

    Spring.net IOC:Invasion of Control,控制器翻转,名字由英文翻译过来就是这个意思了,其实用通俗的话来说就是:将创建对象的职责交给控制器来做,这个控制器就是spring了 ...

  5. 分块 (貌似能用LCT做,反正我现在还不会) BZOJ 2002

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 9844  Solved: 5070[Submi ...

  6. java-jdbc-mysql:实现数据库表的增删改查

    以数据库test下数据表student(sno,sname,ssex,sage,sdept)为例: student表中的已有的所有记录:

  7. 一张图搞懂Spring bean的完整生命周期

    一张图搞懂Spring bean的生命周期,从Spring容器启动到容器销毁bean的全过程,包括下面一系列的流程,了解这些流程对我们想在其中任何一个环节怎么操作bean的生成及修饰是非常有帮助的. ...

  8. 【BZOJ】1834 [ZJOI2010]network 网络扩容

    [算法]网络流-最大流+最小费用最大流(费用流) [题解] 第一问跑最大流. 第二问: 原始边相当于费用为0的边,再原图(跑过最大流的图)基础上添加带费用的边,容量为k(相当于inf). 第一问最大流 ...

  9. ajax技术整理总结(1)

    1.创建ajax对象 var xhr=new XMLHttpRequest(); 4.监听状态信息 xhr.onreadystatechange=function(){ //4接收完毕 ){ docu ...

  10. Oracle-AWR报告简介及如何生成【转】

    AWR报告 awr报告是oracle 10g及以上版本提供的一种性能收集和分析工具,它能提供一个时间段内整个系统资源使用情况的报告,通过这个报告,我们就可以了解Oracle数据库的整个运行情况,比如硬 ...