Yii 简明学习教程

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 <?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 2.0 权威指南 本教程的发布遵循 Yii 文档使用许可. 版权所有 2014 (c) Yii Software LLC. 介绍 已定稿 关于 Yii 已定稿 从 Yii 1.1 升级 入门 已定稿 安装 Yii 已定稿 运行应用 已定稿 第一次问候 已定稿 使用 Forms 已定稿 玩转 Databases 已定稿 用 Gii 生成代码 已定稿 更上一层楼 应用结构 已定稿 结构概述 已定稿 入口脚本 已定稿 应用 已定稿 应用组件 已定稿 控制器(Controller) 已定稿 视图(View) 已定稿 模型(Model) 已定稿 过滤器 已定稿 小部件(Widget) 已定稿 模块(Module) 已定稿 前端资源(Asset) 已定稿 扩展(extensions) 请求处理 已定稿 运行概述 已定稿 引导(Bootstrapping) 已定稿 路由(Route)引导与创建 URL 已定稿 请求(Request) 已定稿 响应(Response) 已定稿 Sessions(会话)和 Cookies 已定稿 错误处理 已定稿 日志 关键概念 已定稿 组件(Component) 已定稿 属性(Property) 已定稿 事件(Event) 已定稿 行为(Behavior) 已定稿 配置(Configurations) 已定稿 类自动加载(Autoloading) 已定稿 别名(Alias) 已定稿 服务定位器(Service Locator) 已定稿 依赖注入容器(DI Container) 配合数据库工作 编撰中 数据访问对象(DAO) - 数据库连接、基本查询、事务和模式操作 编撰中 查询生成器(Query Builder) - 使用简单抽象层查询数据库 编撰中 活动记录(Active Record) - 活动记录对象关系映射(ORM),检索和操作记录、定义关联关系 编撰中 数据库迁移(Migration) - 在团体开发中对你的数据库使用版本控制 待定中 Sphinx 待定中 Redis 待定中 MongoDB 待定中 ElasticSearch 接收用户数据 编撰中 创建表单 已定稿 输入验证 编撰中 文件上传 待定中 多模型同时输入 显示数据 编撰中 格式化输出数据 待定中 分页(Pagination) 待定中 排序(Sorting) 编撰中 数据提供器 编撰中 数据小部件 编撰中 主题 安全 编撰中 认证(Authentication) 编撰中 授权(Authorization) 编撰中 处理密码 待定中 客户端认证 待定中 安全领域的最佳实践 缓存 已定稿 概述 已定稿 数据缓存 已定稿 片段缓存 已定稿 分页缓存 已定稿 HTTP 缓存 RESTful Web 服务 已定稿 快速入门 已定稿 资源 已定稿 路由 已定稿 格式化响应 已定稿 授权验证 已定稿 速率限制 已定稿 版本化 已定稿 错误处理 已定稿 测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值