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. 相同内容 yaml 与 json 格式对比

    关联数组: yaml person: name: 张三 age: 24 json { "person": { "name": "张三", . ...

  2. Qt ------ 我定义的规则 之 对象命名规则

    类型 + 特性,比如  button_closeLigth 非公有的变量前面要加上小写m_ (指的修饰符为private时) 静态变量前面加上小写s_ 其它变量以小写字母开头 静态变量全大写 (sta ...

  3. 前端PHP入门-007-流程控制

    在之前我们已经使用过if判断语句 基本语法,不能有半点马乎,完全是语法规范规定的,不这么写就错! 简单看看 <?php //定义是否打赏的变量 $dashang = true; if($dash ...

  4. Android Studio 打包自定义apk文件名

    使用Android Studio打包的时候,我们有时候需要自定义apk的文件名,在此记录一下. 在app的build.gradle中,根节点下使用关键词def声明一个全局变量,用于获取打包的时间,格式 ...

  5. jQuery Mobile基本UI组件

    基本页面构造 <!DOCTYPE html> <html> <head> <link rel="stylesheet" href=&quo ...

  6. [译] man 7 pthreads

    NAME      pthreads - POSIX threads   DESCRIPTION      POSIX.1 指定了一组叫做POSIX线程或Pthreads的编程接口(函数,头文件).单 ...

  7. 【BZOJ】4032: [HEOI2015]最短不公共子串(LibreOJ #2123)

    [题意]给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的子序列 (3) A的一个最短的子序列,它不是B的子串 (4) A的一个最短 ...

  8. Docker 配置国内镜像拉取中心,Configure docker to use faster registries in China.

    Networking in China is really bad when it comes to using some cloud based tools like docker, it's us ...

  9. Windows Live Writer博客草稿迁移的一种解决方案

    作为一个苦逼的码农,喜欢写博客做总结是很正常的事,写博客写的久的人都接触过各种客户端工具,最流行的就是Windows Live Writer了. 作为一个苦逼的码农,换电脑也是很经常的事,经常会出现一 ...

  10. lintcode 40. 用栈实现队列

    使用两个栈来回倒腾可以实现队列. AC代码: import java.util.Stack; public class Queue { private Stack<Integer> sta ...