您的位置:首页 > 编程语言 > PHP开发

Yii框架学习

2015-04-07 11:37 204 查看
【Yii框架学习】

介绍、安装部署框架、商城模板与yii结合、MVC

历史:2008年1月 到现在

Php框架:cakephp CI(codeIgniter) symfony TP(thinkphp) zendframework(官方) Yii 等等,还有许多叫不上名字的框架。

Yii:高性能框架、代码重用性发挥到了极致、惰性加载框架、速度非常快

缓存、登录组件、助手(小物件,灵活创建表单,常见html代码)、日志组件等等。

适合开发大型web应用系统

开发者:xue qiang (美国华人)

版本情况:(2008年-----2009年)1.0.0-----1.0.12

(2010年-----现在)1.1.0------1.1.13

【yii框架部署】



我们需要创建自己的应用系统

Cms 内容管理系统

Shop商城系统

Office办公系统

Crm客户关系管理系统







开始访问我们的应用系统。

【yii在什么地方用的多】

框架:dedecms ecshop crm

Dedecms是内容管理系统的框架

Ecshop是做商城网站的框架

Crm是做客户关系管理系统的框架

以上3个框架都是“专门”针对具体领域的框架,这样的框架不灵活,死板。

Yii框架是通用的框架,一般适合客户需求比较灵活、比较花样多,比较复杂的地方。

Yii框架设计模式是主流MVC。

Yii框架是一个纯OOP面向对象框架。

【商城模板与Yii框架结合】

Yii访问需要走路由,设置好路由就会找到对应的控制器和方法

http://web.0507shop.com/ 路由:http://web.0507shop.com/index.php?r=site/index







将样式、图片、js静态资源集成到系统里边

Css样式:/assets/default/css/

图片:/assets/default/img

Js: /assets/js/

静态资源目录统一放入系统常量里边,方便调用。

/protected/config/constants.php







用户登录模板与Yii框架整合:

1. 创建UserController控制器

2. 创建视图views/user/login.php

3. 控制器调用视图$this->renderPatial();

4. 引入css和图片,将样式目录与图片目录放入常量,统一调用。

【路由】

在框架里边我们通过路由获得控制器和方法

我们有了控制器的方法,就可以进一步与视图或模型进行交互
http://网址/index.php?r=控制器/方法
【商城其他页面与Yii结合】

Netbeans生成时间快捷键:

Ctrl+j

今晚主要任务 :商城前台模板 与 Yii结合

1,Yii框架部署起来(根据自己情况搭建虚拟主机,也可以使用localhost)

2, 控制器和视图理解好

控制器:UserController (名字Controller)

方法: actionLogin (action名字)

Views/ 下边有许多目录,目录原则是:每个控制器名字在views下都有对应名字的目录存在,里边存放具体模板文件



3. 理解好常量文件constant.php(样式目录和图片目录定义)

4. 商城网站与Yii框架结合制作出效果(首页、登录、注册、商品列表、商品详细)

控制器调用视图

模板引入样式和图片

自定义控制器:





【昨天内容回顾】

我们又学习控制器和视图





l 父类Controller在哪了?

答:





这个父类我们没有显示包含进程序里边,比如include、requre之类包含指令

l 那么这个父类控制器Controller我们在什么地方给包含进来的?

答:在Yii应用的主配置文件里边main.php,间接通过引入compoments组件目录进来的





l 那么主配置文件main.php在什么地方引入到我们的应用里边的呢?

答:在统一入口处index.php



控制器----》父类控制器----》compoments---àmain.php----àindex.php

在前台通过“布局”展示模板样式
学习使用自动代码生成工具gii,通过gii创建后台模块
在后台将模板展示出来
根据情况引入数据库

【yii布局实现】





布局文件已经实现出来,下面我们需要使用这个布局文件

我们系统默认的布局文件是colum1.php

使用布局文件:






布局文件具体与什么有关系:

控制器渲染视图renderPartial()此方法不会渲染布局

render()这个方法会渲染布局。





下边我要做什么事情?

把公共的头部提取出来





现在我们布局已经做好了:

1. 制作布局文件layouts/文件名字,使用$content代表普遍模板内容。

2. 设置布局文件,在父类控制器里边public$layout = "//layouts/shop";

3. 调用布局文件,在控制器方法里边使用方法render()就会调用布局文件。



【商城后台部署】

一般网站都会有“前台”和“后台”

前台:给一般普通用户来使用

后台:是给公司维护人员来使用,例如我们给网站添加商品、修改商品等操作是通过后台来处理的。

同学们思考:如何创建后台

后台有自己的控制器和视图

我们程序的架构是部署在Yii上边。

Yii自己有一个模块机制,可以帮组我们实现后台的搭建

模块:有自己独立的控制器、独立的视图、独立的模型,其不可以单独部署。

我们创建模块:gii(自动代码生成工具)

gii在Yii里半是以模块形式存在。在main.php配置文件里边打开gii模块,以便使用。



gii模块如何来访问:

通过路由形式访问该模块

http://web.0507shop.com/index.php?r=模块名字
http://url/index.php?r=gii
路由会判断当前的名字,是模块定位到模块,否则定位控制器





现在我们要生成一个后台模块

我们给后台起一个名字“houtai”







现在我们后台模块已经创建成功,要想使用,必须在main.php引入该模块






现在我们访问后台模块

http://web.0507shop.com/index.php?=houtai





后台默认模板文件

D:\www\0507\shop\protected\modules\houtai\views\default\index.php



如上图,后台显示的时候为什么会显示前台的布局内容,是Yii代码重用性的体现,我们可以自定义后台布局进行显示,后边讲解。





【后台模板效果展示】

在后台有用户登录功能

通过控制器和视图展示登录页面

我们操作后台与操作前台是完全一样的行为习惯,不同的是我们访问后台:

http://web.0507shop.com/index.php?r=模块/控制器/方法

后台在访问的时候,路由需要加上模块的名字。

前台访问:

http://web.0507shop.com/index.php?r=控制器/方法














【模块】:

在Yii里边,就是独立形成的MVC设计模式的代码的集合体,也是有一定功能代码的集成,这个功能类似前台功能,前台有控制器、视图、模型,模块也有控制器、视图、模型。前台可以实现的功能,模块都可以实现。





【实现后台其他页面效果】

我们后台整体架构使用html里边的框架标签frameset

后台整体实现:






使用了frameset标签将头部、左侧、右侧三种结合到一起形成了html框架布局,是“品”字型布局。









【后台商品列表页面部署】

控制器goods

视图
















上图right的结合,在单击超链接的时候,连接内容会跑到frame对应的名字里边,name=”right”

target=”_blank” //新窗口展示链接内容

target=”self” //本窗口展示链接内容

target=”名字” //这个名字与frame里边的名字一致,那么链接内容会跑到这个frame里边。

总结:

1. 前台视图文件的布局效果实现

2. 我们使用自动代码生成工具gii生成了后台模块

3. 后台视图页面实现(登录、frameset主体框架页面、商品操作)

明天会学习数据库操作

作业:

1. 利用gii将后台模块创建出来

2. 后台的登录、主体frameset框架页面、商品添加修改展示页面实现出来

3. 布局效果根据个人情况具体实现。

前两天学习Yii框架

前台的控制器和视图制作出来(模板与Yii框架结合)

视图模板关于布局layout使用

后台部署,gii生成后台模块

后台登录、商品展示、主体frameset框架部署起来

模块:让前台和后台的代码在物理上分隔来开

当我们有相对独立的业务需求,都可以通过模块来解决。

【数据库操作】

MVC框架

C:controller 控制器

V:view 视图

M:model 模型

操作数据库步骤:

1) 建立数据库php0507、建立数据表、写入测试数据

2) 通过Yii框架连接数据库main.php






3) 注意:数据库内部处理走PDO,因此需要让php开启PDO扩展。php.ini






4) 测试Yii 框架是否有链接上数据库

在控制器里边随便一个地方输出信息:

var_dump(Yii::app()->db);

红色文字意思是获得数据库组件

Yii::app():Yii框架是纯OOP面向对象框架,每次web请求,相当于通过创建一个类的对象,让对象调用相关方法执行。对象是我们框架应用的核心对象,我们也可以通过代码获得这个应用对象(Yii::app())。






以上信息出现说明数据库有连接成功。

【使用数据库】

现在我们可以对数据库进行增、删、改、查操作

MVC,现在我们需要制作model来操作数据库





创建model模型goods





我们来看看“db”到底是谁?

main.php

Yii框架核心代码大约有10000行,有一个文件将全部核心代码整理了。

D:\www\0507\framework\yiilite.php

【使用数据模型goods】

利用模型查询数据表的数据,在后台实现商品信息的查询

模型:

有多少数据表,就建立多少模型

模型其实就是类

我们对数据库进行操作,需要实例化模型类,产生对象

通过对象调用相关的方法,就可以实现数据库的操作

CActiveRecord:是活跃记录,AR,好多成熟框架都有此技术。

将数据表的相关内容以“类”的形式呈现出来。

我们学习AR技术。





让页面底部产生日志信息:









获得全部商品信息findAll()






结果是一个大的数组,里边有具体对象元素

我们可以遍历这个大的数组。

遍历出来的结果是具体每条记录的对象

记录对象产生了,就可以利用对象调用自己的属性(商品名称、价格、数量等等)获得具体信息

find()会产生一条记录信息,其会返回一个直接对象出来

我们可以通过对象调用自己的属性直接获得具体商品信息

对象->属性;

findAll() 返回了一个数组,里边有好多对象元素信息

find() 直接返回了一个对象,可以通过对象获得具体商品信息。

【数据信息展现到视图模板里边】









通过模型获得商品信息展现到页面上

1. 通过模型获得具体商品信息

2. 将商品信息传递到视图模板里边renderPartial(’视图’,被传递变量信息)

3. 在视图里边获得具体商品信息展示。

【通过具体sql语句获得信息】

AR:findAllBysql();



数据模型:

原则上 一个数据表对应一个模型

模型本质上说就是一个类,

我们对数据库操作需要通过这个类实现,

进而需要实例化这个类,产生对象

对象可以调用类里边的相关方法,进而对数据库进行操作

AR:CActiveRecord, 活跃记录,就是模型,就是类

model





【通过模型model实现数据的添加】

我们操作数据库,需要通过模型创建对象来操作

对象调用相关的方法,实现数据的操作

当我们创建一个对象,这个对象就代表数据表里边的一条记录。

数据表的字段,就是我们创建模型对象的属性

如何添加数据呢

我们把模型对象的属性信息设置好,就可以实现数据的添加。










【利用页面表单实现数据添加】

利用助手进行表单展现

助手:利用php程序来生成html代码。

Yii里边称助手是“小物件”widget

通过widget小物件创建添加商品的表单

首先处理视图:





其次 控制器需要把当前模型对象传递到视图里边,以供表单使用






再次 数据模型需要有一个方法提供汉字名字统一显示











<?php echo $form -> labelEx($goods_model,'goods_name') ?>

<?php echo $form -> labelEx($goods_model,'goods_weight') ?>

等等。

表单校验:







今天5月9日内容总结

数据库操作

1. yii框架连接数据库main.php(db组件的配置)

2. 制作数据模型model

3. 我们通过数据模型对数据库进行查询和添加信息操作。

4. 通过小物件生成form表单

作业:

1. 配置数据库,完成goods模型的创建

2. 通过小物件实现添加商品信息form表单的显示







模型model

关于商品的数据模型goods model (MVC)

利用商品模型实现数据的查询和添加

查询:

findAll()

find()

findBySql

findAll()该查询系列帮助我们获得多条数据,以数组形式给我们返回,数组里边的每个元素都是一个模型对象。获得具体数据需要遍历。

find()该查询系列帮助我们每次只获得一条数据,以模型对象的形式给我们返回。

我们使用模型model步骤:

1. 创建模型对象

① 模型名字::model()

② new 模型模型()

2. 利用对象调用模型里边的一些方法,实现对数据的操作

【商品数据添加】

现在我们已经把添加的表单展现出来,widget小物件展示的表单。

表单展现:

model

attributeLabels() 模型属性与汉字标签名字对应

controller

将模型传递到视图里边

view(小物件widget)

CactiveForm

textField() 普通输入框

label() 展现标签对应名称











标签名称与模型属性对应





【商品添加逻辑部分】

在控制器我们接收表单数据














商品添加

制作表单

收集表单数据,收集好的数据给予数据模型

数据模型调用save方法,实现数据添加

【数据修改】

获得被修改的数据-----》展现到一个表单里边(呈现被修改数据的)-------》在表单里边针对具体内容进行修改-------》修改完毕提交表单进行数据的更新


















修改商品信息,我们使用的模板是添加时候的模板,基本没有改动,form表单使用小物件构建的,这个小物件会自动把关联的信息给显示出来,节省了我们开发的成本,这也是我们使用小物件创建form表单的原因之一。

还有一个使用小物件的原因是表单验证需要使用小物件。





同样是save()方法被调用,有insert语句或update语句区分。

new Goods() 和Goods::model()

都可以进行查询

前者主要是在添加的时候使用,后者是在查询或修改的时候使用。

如果我们添加数据,不使用new Goods,而使用Goods::model那么数据添加失败。





【商品信息删除】





【new Goods
和 Goods::model()
追代码】


new Goods 执行insert (要执行构造函数)

Goods::model() 执行update






CactiveRecord









【数据查询延伸】

AR(CActiveRecord)活跃记录





find() 查询一个信息

findByPk 根据主键查询信息

findBySql根据sql语句查询信息

findAll()查询全部信息

findAllByPk 根据主键查询全部信息

findAllBySql根据sql语句查询全部信息

findBySql 和findAllBySql

根据sql语句查询信息,前者会查询一条记录信息,后者会查询条记录信息

前者给返回一个数据模型对象,后者以数组形式给我们返回多个数据模型对象

select * from goods limit 10

findByPk 和findAllByPk

都是根据主键进行信息的查询

前者每次只可以传递一个主键信息,后者可以传递一个也传递多个

后者传递参数,如果是多个主键信息,需要以数组形式给我们传递。





select condition order limit offset 都是从哪来的。

我们使用findAll() 该方法是数据模型给我们封装好的方法,可以获得全部数据

findAll()是CactiveRecord这个类的成员方法。AR是对数据库向上的封装,AR通过OOP面向对象方式操作数据库。AR需要最终转变为具体的sql语句,通过一个中间类(criteria标准)协助转为的具体sql语句,上边的关键字就是这个中间类criteria的一些属性。











今天内容总结

1. 商品添加逻辑部分完成(save())

2. 商品信息修改,通过widget小物件创建的表单可以用在添加和修改两个地方。

通过get方式传递被修改商品信息id,同时在控制器方法里边有参数接收

3. 删除商品信息 delete

删除和修改信息,需要注意是那个模型对象调用方法。







4. 详细介绍数据查询和中间标准类criteria讲解

作业:

商品的增、删、改、查最好都要实现一遍。

【昨天内容回顾】

在后台对商品信息进行增、删、改、查

数据模型model进行操作

增加数据:

通过小物件widget建立表单

收集表单信息,将信息放入数据模型的对象里边

调用数据模型的方法save()实现数据的存储(insert) new Goods

修改数据:

通过get方式传递被修改商品的id

通过小物件widget建立修改表单

收集表单信息,将信息放入数据模型的对象里边

调用数据模型的方法save()实现数据的存储(update) Goods::model

删除数据:

del($id) ---------à deleteByPk($pk,$condition='',$params=array())

通过get方式将被删除商品的id传递到删除页面

将模型对象创建好,就可以删除商品信息了

查询数据:

find() 每次只获得一条数据,以模型对象的形式给我们返回

findBySql

findByPk

findAll() 每次可以获得多条数据,数据是以模型对象数组(即使结果只有一条)的形式给我们返回

findAllBySql()

findAllByPk

find($contion,$param)

$condition 相当于where后边的条件

$param 给where条件设置参数值

中间类criteria,

select group order alias condition offset limit

AR方式处理数据库信息activerecord 活跃记录

findBySql();

DAO





数据分页、前台用户注册、根据具体情况讲解用户登陆系统

【商品信息分页数据】

总的记录数目count == 110条数据

每页需要显示信息数目per == 20条数据

分页的总页数 page = count 除以 per 向上取整 5.5向上取整等于6





获得具体每页信息

limit 该关键字在mysql里边可以限制每次获得信息的条数

limit 偏移量,条数;

偏移量=(n-1)*per,20;



第一页:limit 0,20; 1

第二页:limit 20,20; 2

第三页:limit 40,20; 3

第n页:limit (n-1)*per,20;









我们已经准备好了一个分页类

通过小案例,演示分页类使用。











分页类与Yii框架结合

分页类在Yii框架里边以组件components形式存在













分页:

1. 获得总的商品记录数目

2. 实例化分页对象

3. 重新拼装具体分页sql语句指令

4. 获得页码列表

分页类与Yii框架结合,是以组件components的形式存在。

【前台实现用户注册功能】

就是在数据库里边建立一张数据表,建立一个表单,实现信息收集存入数据库

在本质上与商品添加是一样的

① 实现多种样式表单域

② 表单数据验证

在数据库建立用户注册表sw_user







设置separator分割符。



实现用户注册信息收集、校验信息(表单验证)









现在我们实现表单验证。



















我们调用attributes一个模型里边不存在的属性,类会自动执行魔术方法__set();





今天内容总结:

1. 数据分页实现 分类页当做组件被继承到Yii框架里边

2. 小物件widget创建用户注册表单,使用多种表单域实现方法。

3. 通过model数据模型里边的方法rules()设置,具体验证规则

4. attributes是数据模型的属性,可以帮组我们收集表单信息。

作业:

1. 在后台,实现商品数据分页显示

2. 在前台,通过小物件把用户注册表单实现出来,练习小物件widget使用。

2013-5-16

1. 用户注册验证

2. 用户登录系统功能

【用户注册验证】

通过小物件创建form表单 [view]

收集表单数据 attributes(对foreach的封装) [controller]

表单数据验证 rules() [model]























复选框验证

















$user_model -> attributes =$_POST['User'];

attributes这个属性在使用的时候会收集表单信息并赋予模型属性里边

该属性是和rules()方法一并使用,只有在rules()里边设置了验证规则的属性才可以被attributes接收

如果有的属性没有具体验证规则,则给一个safe规则。





确认密码验证





label 与 labelEx区别

如果有的选项是必填项(例如用户名、密码),那么labelEx会有一个”*”星号标识,label就没有





表单验证:

rules()放进行数据验证

两类:一个是系统已经定义好的验证类,另一个是我们自己在模型里边定义好的具体验证方法进行验证。

【引入jquery进行数据验证】





有的项目是jquery本身无法验证的,那么就会跑到服务器继续验证。

【用户登录系统实现】

1. 制作表单

2. 收集表单数据(用户名、密码)

3. 去数据库校验用户名和密码

4. 用户信息session持久化

在Yii框架里边有两个模型:数据模型、表单模型

数据模型:与数据库进行交互的模型model(例如good模型、user模型)

表单模型:收集用户信息,然后丢弃。

我们要使用登录表单模型来进行用户登录系统功能实现






登录模型操作与数据模型是一致的,不同的是,登录模型不与数据库进行交互。





表单数据校验save()方法可以一边校验数据,校验成功可以存储数据

save() 到后边有一个环节会执行模型的rules()方法,也就校验表单了

我们现在实现用户登录需要校验,可以调用validate(),该方法可以校验我们输入的信息。

validate() 该方法在执行到后边 也会去执行rules()方法,进行表单的校验

save()

validate()

rules()

save()方法执行会执行validate()方法,后边也会执行rules()方法

















组件UserIdentity类的父级。











持久化用户信息login















用户登录系统:

表单

在控制器里边收集信息

验证用户信息:模型->validate()来验证用户信息,与表单验证是一致的

用户信息真实性:rules()方法里边有自定义一个方法来验证authenticate()

具体通过用户验证组件UserIdentity来验证的,这个组件里边也有一个方法authenticate()方法进行验证

持久化用户信息:模型调用login()方法来持久化。

总结:

表单验证

用户登录系统

作业:

1.实现用户注册表单验证

2.实现用户登录系统

2013-5-21

Yii框架前台用户注册、用户登录系统实现

校验用户名和密码

使用组件UserIdentity对用户名和密码进行校验

用户名存储到session里边,通过用户验证组件CwebUser à login();

【用户注册用户名密码md5加密】

【记住用户(2周不用重复登录)】

红色的”*”星号是css控制的

记住登录状态

这样下次再登录网站的时候,就不用重复输入用户名和密码。

是浏览器的cookie把状态给记住了。

通过图解查看Yii框架如何实现记录登陆状态

实现:

1. 制作表单

2. 实现model模型

Cookie的名字和值,在框架里边已经设置好了,无需关心。

为什么不能退出系统

答:退出系统的时候只是删除session信息,页面重定向回首页,由于我们登录系统的时候已经让cookie记住了登录系统,每次访问网站的时候都会读取cookie信息,再session持久化。有点死循环过程。

1. 制作表单

2. 设计模型(rules() login() attributeLabels())

【用户登录系统验证码设置】

Gd2画图工具

验证编码信息:随机数

验证码具体验证原理:

画图的同时就把验证编码进行session存储,用户输入的验证码信息与我们session里边存放的信息做比较。

实现:

1. 制作表单

如何使用该核心类:

在控制器里边使用。

表单部分与控制器部分的联系:

$this->widget(‘CCaptcha’); 会间接调用控制器的方法 路由user/captcha

在登录模型里边对验证码进行校验:

‘captcha’会简介找到CcaptchaAction进行验证码的比较。

验证码使用步骤:

1. 在控制器设置actions方法

2. 在表单里边通过widget显示验证码

3. 在模型里边通过captcha校验验证码

<?php $this -> widget('CCaptcha'); ?> 会简介访问路由 user/captcha (CcaptchaAction)

array('verifyCode','captcha','message'=>'请输入正确的验证码'), 简介通过CcaptchaAction进行校验。

【后台用户登录系统】

1. 复习前台用户登录系统

2. 区分前台、后台用户信息(session区分)

为添加的数据表创建模型model

现在出现一个问题:前台登录用户信息与后台用户登录系统有混淆。

为后台管理员登陆系统设置session前缀信息houtaiModule.php

【Yii框架中session的使用】

设置、使用、删除

【cookie在Yii框架中的使用】

【路径别名】

在Yii框架里边有许多地方使用路径别名:

System application zii 等等

总结:

用户登录系统

记住登录状态(rememberMe)

验证码 (控制器、视图、验证模型)

后台管理员登录系统(为用户登录session信息设置前缀houtaimodule.php设置)

会话控制session cookie的使用

作业:

1. 前台登录系统实现“记住登录状态“

2. 前台登录系统“验证码“功能实现

第二个问题:session设置了前缀,前后台,读取用户名的时候,代码是一样的,yii框架是怎么区分前缀的。
我们读取用户登录信心通过CwebUser读取

Yii::app()->user->name; //获得name信息的时候会自动设置当前user用户组件的session前缀

2013-5-22

用户登录,记住登录状态、验证码、后台登录系统

【用户访问控制】

系统后台:用户登录、后台首页面、商品列表、添加商品、修改商品

后天的一些页面在用户没有登录系统的时候是不允许访问的,例如
商品列表、添加商品、修改商品


有一些页面无论用户是否登录系统,都是可以访问的,例如 用户登录

注意:

有的控制器方法被禁止访问(即使登录用户也如此),如果被访问,那么首先会询问用户是否是登录,如果用户已经登录系统,那么直接是403禁止访问。

关键字解释:

定义用户权限:

l * 全部用户(无论登录与否)

l ? 匿名用户

l 用户名,具体用户

l @ 登录系统用户

用户访问控制两个符号:+ -

+ 表示过滤器专门是针对哪个方法起作用

- 表示除了此方法,其他方法都会进行过滤

默认跳转登录界面:

前台:

后台:

【Yii::app()的理解】

Yii::app() 是一个实例化的对象,是我们在当前框架里边可以直接操作的对象,

我们可以把这个对象理解成请求应用的第一个对象。

Yii框架是纯OOP面向对象框架,也就是利用对象调用类的属性、方法,完成应用请求。

通过上图分析,我们知道了Yii::app()是系统第一个对象,是老大,我们可以利用该对象调用系统里边其他的相关方法、属性、对象。

Yii::app() 是CwebApplication类实例化的对象

CwebApplication(framework/web/CwebApplication.php)

因此Yii::app()可以调用CwebApplication或父类 CApplication里边的相关属性或方法。

注意:不要随便访问CwebApplication或 其父类的 相关方法,会影响系统稳定。

可以通过函数get_class(对象),根据对象获得对应的类。

系统应用组件

我们可以通过Yii::app()调用系统的组件

User session request log db等等

在系统的任何角落都可以直接访问以上组件

Yii ::app()->user (实例化对象'CWebUser' => '/web/auth/CWebUser.php',)

Yii ::app()->session(实例化'CHttpSession')

Yii ::app()->request

Yii ::app()->db

Yii ::app()在入口处实例化index.php

【提示信息Flash()】

setFlash() 设置提示信息

getFlash() 提取提示信息

hasFlash() 判断提示信息有无

例如:setFlash(‘success’,’添加商品成功’)

会在session里边存储success信息

HasFlash(‘success’) ; 会判断当前session里边有没有名字是success这个变量

getFlash(‘success’) 会去session里边提取名字为success这个变量,

之后会把success这个变量给我们删除(重新刷新页面这个条信息也就消失了)

以上flash信息是用户组件user来设置

视图显示

【显示时间】

显示sql语句运行时间main.php

自己写的脚本代码运行时间

【用户退出系统同时删除session和cookie】

Yii ::app()->user->logout() ;

【如何获得当前控制器和方法】

控制器:$this-> id ;

方法:$this->action->id ;

总结:

1. 用户访问控制过滤

* @ ? 用户名 + -

Filters

accessControl

accessRules

2. 直接操作的实例化对象Yii::app()

3. 显示提示信息setFlash() getFlash() hasFlash()

4. sql语句或脚本代码的执行时间显示Yii:: beginProfile() endProfile()

5. 用户退出系统集中删除cookie 和session

6. 控制器和方法如何获得$this-> id; $this -> action->id;

作业:

在后台要为具体控制器设置上用户访问控制过滤

(在后台用户没有登录系统是禁止访问的)

2013-5-23

用户访问控制过滤filters

用户级别:* @ ? 用户名

符号: + -

Filters()

accessControl

accessRules

权限:srbac

【缓存】

什么是缓存:我们从数据库读取出来的信息暂时放到一个更快的介质上存储,下次从这个更快的介质上读取信息。

介质:文件、数据库(优化好的数据)、内存



我们网站在进行访问的时候,有一些信息在相对一段时间之内是稳定,我们就把这样的信息放入缓存里边,这样用户每次来访问就是访问缓存的信息,对于大负载量的网站,可以明显提高网站的性能。


缓存类型:

为了缓存学习效果更好,我们制作两个页面实现缓存

台前的商品列表页面

台前的商品详细页面

缓存分类:

片段缓存

页面缓存

动态缓存

数据缓存

【商品列表和详细页面制作】

【片段缓存】

进行商品列表的独立区域缓存,片段缓存

我们的缓存是文件缓存,缓存的信息在目录runtime存放

使用缓存步骤:

1. 在程序里边设置缓存

2. 在主配置文件main.php里边配置缓存组件cache(在这个地方决定使用哪种缓存)

设置缓存文件的过期时间

Duration ()

我们为缓存文件设置过期时间,在没有过期的时候系统都会使用缓存文件,如果已经过期,那么系统要重新生成缓存文件。

缓存变化:

我们的商品列表有实现片段缓存,那么在访问其他其它页码信息的时候也是访问这个缓存页面,因为,每页信息的路由都是一样的(goods/category),那么系统会误认为当前系统访问的页面是一个页面。当时页面的page参数是不一样的。

因此我们需要根据参数的变化生成不同的缓存文件。

缓存依赖:

我们的商品信息缓存可以自定义设置过期时间,根据具体需求业务类型决定,如果商品信息在没有过期之内已经变化了(数据库给更改的),这时缓存文件还没有过期,我们需要及时更新缓存文件(即使没有过期)以免误导客户,这种情况我们可以通过缓存依赖来实现。

缓存依赖条件:我们依赖的条件是总的商品价格,如果总价格发生变化,那么有可能是商品的信息有增加或减少的情况,或商品价格被修改。

如果一个商品价格增加5元,另一个商品价格减少5元,这样是不会更新缓存的,因为商品总价格没有发生变化。

片段缓存步骤:

1. 在main.php里边设置cache组件

2. 实现片段缓存(beginCache endCache)

3. 缓存变化

4. 缓存依赖

Duration、varyByParam、dependency这个几个属性在哪?

System.web.widgets.CoutputCache.php

【页面缓存】

1. 是否可以通过“页面缓存”实现

答:这样是不可以,因为布局文件还没有被缓存

2. 我们是否可以再布局进行页面缓存

答:理论上不可以,视图先加载,布局后加载

视图:0.05135800 1369315232 时间小,先加载

布局:0.05197600 1369315232 时间打,后加载

用户访问控制实现页面缓存

Filters

accessControl

accessRules

【数据缓存】

具体就是可以缓存变量信息

变量 缓存的使用

设置:Yii::app()->cache->set(名字,值,过期时间);

使用:Yii::app()->cache->get(名字);

删除:Yii::app()->cache->delete(名字);

清空:Yii::app()->cache->flush();

数据缓存应用(重要):

【动态缓存】

Smarty 动态缓存 insert

我们可以缓存整个页面,但是只有一个小的区域,会根据不同的条件显示不同的信息,这个小的区域我们需要设置动态缓存。

$this -> beginCache()

中间有区域需要动态缓存

回调函数:就是控制器里边的普通方法

$this -> renderDynamic(回调函数);

$this -> benCache()

这个show_name()控制器要放入普通控制器父类里边Controller,这样代码可以重复利用。

总结:

缓存

1. main.php配置缓存组件cache

2. 缓存类型:片段缓存、页面缓存、数据缓存、动态缓存

3. 缓存存介质:文件、数据库、内存

片段缓存:beginCache()

页面缓存:filters过滤器实现

4. 具体变量缓存

Yii::app()->cache->set(名字,值,过期时间)

Get(名字)

Delete(名字)

Flush()清空缓存,(数据、片段、页面都会清空)

作业:

利用数据缓存制作案例

前台商品详细信息,在通过数据库获得数据的时候要走缓存。

(缓存里边有数据走缓存,否则走数据库再生成缓存)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: