04mvc框架原理(8days)03

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了04mvc框架原理(8days)03相关的知识,希望对你有一定的参考价值。

页面跳转

header(‘Location: url‘);

优势:在于立即跳转!

劣势:没有办法在跳转前给出提示!

?

header功能是,发送响应头信息!相应头信息,是相应信息的一部分!通知浏览器应该做哪些事情的部分!但是要求,相应头信息,要先于响应主体(相应信息的其他部分)先被发送到浏览器

因此,无论如何也是看不到echo的提示:

技术分享

甚至,上面的代码会出现语法错误!

默认在于php有个叫:输出缓冲功能,会默认缓存所有的主体输出!

技术分享

技术分享

?

因此,编程上建议在使用header函数时,前面不应该有任何的输出!包含html输出和phpecho输出!

技术分享

?

location.href=‘url‘,javascript

技术分享

技术分享

提示是,样式不易控!(可以用弹出层)

?

但是,js的支持,需要浏览器支持才可以!

?

meta:Refresh

refresh 是刷新的意思,可以提供一个秒数,刷新的间隔!

技术分享

同时,支持设置刷新的目标url !

技术分享

?

有需要当前页面执行结束后才会刷新,因此容易给出提示,包括提示的样式!

?

因此项目中典型的提示跳转都由 refresh完成!

?

?

项目中的跳转实现

?

基础控制器

跳转功能典型的是一个项目流程控制,应该属于Controller控制器!

所有的控制器都可能使用到跳转方法!

问:应该写在哪里?

答:一个控制器公共的地方!

?

参考模型的模式:

增加一个基类控制器,将所有控制器公共操作都放在其中,所有的实例控制器都继承自公共基础控制器类:

?

framework/Controller.class.php

技术分享

?

控制器继承自,基础控制器:

技术分享

?

同时,完善 自动加载方法,可以达到自动载入基础控制器类的目的:

index.php:

技术分享

完善跳转方法,jump()

framework/Controller.class.php

jump()

技术分享

?

技术分享

技术分享

?

?

格外注意

跳转的代码执行结束后,脚本是没有停止的!

因此,跳转的代码后边强制脚本停止!

技术分享

?

?

?

?

项目公共类

用于完成成项目的整体初始化工作!

原本在index.php入口文件,完成的工作,放入到一个项目的框架公共类中!

?

在 框架目录增加一个类文件:

Framework.class.php

技术分享

index.php内的每个功能映射 一个Framework类中的某个方法!

?

为了练习静态成员!

framework类中所有的方法定义成静态的!

?

技术分享

技术分享

技术分享

?

一个总的方法,去调用上面的各个方法:

技术分享

?

入口文件,直接调用run即可完成项目的运行:

index.php

技术分享

?

?

自动加载方法的处理

?

将自动加载的函数,也变成Framework类的一个方法:

技术分享

此时的问题是php不知道调用该方法,只会调用__autoload的函数,但是没有!

应该告知 php,在需要自动加载时,调用我们定义的方法!

技术分享

注册自动加载方法

利用 系统函数:

spl_autoload_registser()

?

如果需要注册的是一个函数:直接提供函数名即可

技术分享

?

如果是方法的话:需要给出类或者对象(是否是静态) 和 方法名!

此时需要一个数组,使用两个元素,分别表示

array(类名或对象,方法名);

技术分享

?

在初始化项目是,也需要注册自动加载方法:

技术分享

?

?

配置文件系统

  1. 增加一个文件,保存配置信息
  2. 项目运行时,将配置文件载入,就可以使用配置信息!

?

增加配置文件

在app目录增加一个config子目录,用于管理配置文件:

技术分享

在配置文件目录,增加一个app.config.php文件,管理相应的配置文件信息

技术分享

?

设计配置数据的格式:

将配置分组:

技术分享

最终是一个二维数组!

?

注意,增加return

用于,在载入该文件时可以返回内部的数据!

?

?

载入配置文件

增加一个框架级别的基础操作,载入配置信息!

在framework/Framework.class.php

增一个方法,在run方法中执行即可!

注意:1需要使用一个路径常量,管理配置文件目录!2,需要一个数据变量接收配置数据

技术分享

考虑获得数据的变量:

保证保存配置信息的变量的全局性!使用$GLOBALS

技术分享

?

使用配置信息

在基础模型实例化mysqlDB类时需要使用

framework/Model.class.php

技术分享

?

?

增加后台首页

后台整体首页

控制器

增加一个后台的首页模块控制器

app/controller/back/IndexController.class.php

indexAction()

展示后台模板即可!

是一个框架集frameset布局!

技术分享

?

?

模型

暂时不需要模型

?

视图

增加一个后台首页模板

app/view/back/index.html

?

注意,此时是一个框架集布局:

结构如下:

技术分享

下(左中右)

?

其他

在登录验证用户合法后,跳转到后台首页!

app/controller/back/AdminController.class.php

signinAction();

技术分享

各个部分

除了后台整体页面之外,还需要

top:

menu,

drag

main

以上四个功能才能形成一个完整的后台首页

?

问题,如何处理以上四个功能?

每个功能都应该是一个项目的完整的功能,应该mvc三部分组成!

因此,所有的请求地址:都应该是请求当前项目的一个控制器动作才可以!

?

后台首页主体模板:

app/view/ back/index.html

?

技术分享

?

需要项目中的4个动作完成:

app/controller/back/IndexController.class.php

技术分享

技术分享

?

完善以上四个动作:

载入不同的模板即可!

技术分享

提供四个模板:

app/view/back/下:

?

?

?

?

后台的登陆验证

技术分享

?

判断是否经登陆,!

?

问:这个判断条件(依据)从哪里来?

答:应该登陆成功后,为浏览器用户设置登陆凭证,在请求后台首页时进行判断!

?

问:使用什么来作为登陆凭证?

答:

变量可否?不行,已经消失!找一个不会消失的!

url传递是否可以?不行,凭证可以轻易仿照!找一个可以向向下传递,并且不能被轻易模拟的!

数据不向下次请求传递,就获得不了!

服务器本身是不存在在多次请求间传递的数据。抛出数据库,文件中的持久数据!

文件可否?不行,数据永远存在,对所有的浏览器都好用!

?

因此总结:

既能够在多次请求间向下传递,还要区分浏览器,最好不能被(用户看到)轻易模拟!

由于web服务器都是基于http协议,http协议是无状态的,导致任何请求之间没有任何关系间可言。导致php所有资源在脚本结束都消失!

?

解决该问题的本质方法,需要浏览器参与!

?

此时,可以使用 浏览器上的cookie技术!

?

cookie技术

浏览器的技术,可以在浏览器上保存数据的一门技术!cookie就是指的是浏览器上保存的数据!

PHP支持cookie技术!php可以向浏览器发出指令,从而将数据保存到浏览器上!

?

浏览器负责保存数据,而php负责控制浏览器保存那些数据!

(php在是使用浏览器上cookie技术)

?

?

保存在浏览器上的cookie数据,可以在浏览器每次项服务器请求时,都可以携带该数据,向服务器发出请求,此时服务器上的脚本就可以获得该数据!

?

基本使用

设置cookie变量,增,改,删

利用内部函数 setcookie完成

setcookie(名字,值)

技术分享

取得cookie变量,读

使用预定义数组变量:$_COOKIE

该变量内保存所有从浏览器请求时所携带的cookie数据!

每个元素就是一个cookie变量数据!下标是名字,值,就是值!

技术分享

?

?

基本原理

利用firebug的网络选项卡:

技术分享

设置时,做了什么?

技术分享

在响应时,服务器发送了一条指令,在浏览器上增加一个cookie变量!

技术分享

浏览器接到该指令后,在浏览器上增加了一个cookie数据!

?

?

获取时,做了什么?

技术分享

浏览器会将当前站点的所有的cookie在请求时都携带到服务器上!

php会自动获得到浏览器携带的cookie,形成$_COOKIE数组,用户脚本使用!

技术分享

?

?

高级使用

  1. cookie数据只能是字符串数据!

技术分享

?

  1. setcookie函数,可以完成增,修改,删除!

不存在,则增加,存在则修改!

删除,可以采用将值,置空的形式!

技术分享

?

  1. cookie变量的失效期

cookie数据存在有效期的概念:

默认,临时cookie。会保存到浏览器关闭!

同时,支持,增加setcookie的第三个参数,来修改cookie变量的有效期。有效期的表示方式,是一个时间戳,表示到哪个时间点,失效!

php可以通过 time()函数,获得当前的时间戳,time()增加增量的形式延长cookie时间!

技术分享

此时,服务器会向浏览器发出如下指令:

技术分享

网络上表示时间,都是用 格林威治平时!没有时区概念的那个时间!GMT

浏览器知道cookie变量的有效期!

技术分享

?

常用的操作:

技术分享

技术分享

?

  1. cookie存在有效路径的概念

cookie变量是只在当前目录,及其后代目录才会生效!

?

test/下设置

test/sub/下可以访问

技术分享

反过来:

技术分享

?

那是由于该cookie:

技术分享

?

可以更改cookie数据的有效路径:

通过setcookie的第四个参数做修改:

技术分享

/表示站点根目录有效!整站有效!

技术分享

技术分享

?

?

5,cookie子域名的概念

技术分享

cookie是严格区分域名的。

?

支持在子域名之间是可以共享的:

利用第五个参数设置

技术分享

?

?

有效期,有效路径,有效子域名!

6,$_COOKIE是捕获不了当前脚本所设置的cookie变量的!

?

技术分享

$_COOKIE是,浏览器请求时所携带的所有cookie!

当前设置的在下次使用请求才好用!

?

session技术,会话技术

场景:

cookie的问题

由于是数据本身是在浏览器端:

数据的安全性问题!

数据总要在请求时携带!

?

怎么解决,注意保持在浏览器的多次请求间共享数据!

?

将数据放在服务器端,同时是数据区分浏览器,在浏览器的多次请求间共享数据!

技术分享

?

在服务器上,为来访的每台浏览器增加一个数据空间,然后为这些数据空间分配不同唯一的标识!为每个浏览器分配一个唯一的标识,该标志应该服务器端数据库空间的标识应该一一对应

要求,浏览器每次请求时携带标识,此时服务器可以获得标识,利用标识确定数据空间,但却请求的所有的数据处理,都在当前的确定的空间内完成!

?

将服务器分配给浏览器的唯一标识存在浏览器的cookie内,可以保证浏览器每次来时都携带!

服务器为每一个新浏览器访问(没有确定标识的浏览器),确定 标识,和在服务器上生成一个唯一的数据空间!

?

?

基本使用

直接操作$_SESSION数组,就可以完成session数据的存,取!

每个session数据,就对应$_SESSION内的一个元素!对元素操作,就是对session数据做操作!

?

但是,session技术,包括生产session标识,开辟session数据空间,为浏览器分配session标识等等,都需要PHP的session机制支持!

因此,需要先开启session的支持,才能操作$_SESSION变量,从而去操作session数据!

?

开启:

session_start();

?

操作:

$_SESSION;

?

先开启后操作:

技术分享

技术分享

?

更新和删除:

技术分享

?

?

基本原理

?

浏览器端cookie中保存的sessionID:

?

当前浏览器第一次对服务器发出请求时,服务器不能确定浏览器的标识

会重新生成一个唯一标识,以cookie的形式保存到浏览器端!

其中默认的cookie变量名为:PHPSESSID。

该cookie标量,也被称之为 sessionID

技术分享

?

当浏览器拥有了sessionid这个cookie变量后,接下来的请求都会携带该ID发出请求:

技术分享

?

服务器的端的是session数据空间

默认情况下,php,会将保存session数据的空间,生成一个文件来完成!通过文件的名称来区分属于哪个ID的!

默认的被保存在服务器操作系统的临时目录内:

技术分享

技术分享

?

?

大概的流程:

技术分享

?

?

?

测试:

使用session来完成登陆标识验证:

技术分享

?

技术分享

以上是关于04mvc框架原理(8days)03的主要内容,如果未能解决你的问题,请参考以下文章

04mvc框架原理(8days)04

04mvc框架原理(8days)01

04mvc框架原理(8days)02

04mvc框架原理(8days)05

如何实现MVC模式

Web MVC框架-命令及页面跳转