2014年12月15日星期一

传智孙叔华Thinkphp3.2笔记 (1)



php框架


真实项目开发步骤:

1. 多人同时开发项目,协作开发项目、分工合理、效率有提高(代码风格不一样、分工不好)



2. 测试阶段

3. 上线运行

4. 对项目进行维护、修改、升级(单个人维护项目,十分困难,代码风格不一样)

5. 项目稳定的运行阶段

6. 项目停止运行(旧项目的人员已经全部离职,新人开发新项目)

 

问题:

1. 多人开发项目,分工不合理,(html   php   mysql

2. 代码风格不一样,后期维护十分困难

3. 项目生命周期十分短,项目生命没有延续性,造成资源浪费、人员浪费

4. 项目不能很好适应客户需求,牵一发而动全身。

 

其他相关框架

1. zendframework   zend php语言公司发布的官方框架,重量级(功能多)

2. yii   美国华人开发的框架,xue qiang, qiang,  重量级框架,纯OOP框架

3. CI  CodeIgniter   轻量级框架,开发速度快,部署灵活

4. cakephp  外国框架,重量级,速度慢

5. symfony  外国重量级框架

6. ThinkPHP 轻量级框架,国人框架,入门容易

 

什么框架:

一堆代码的集合,里边有变量、函数、类、常量,里边也有许多设计模式MVCAR数据库、单例等等。

框架可以节省我们50-60%的工作量,我们全部精力都集中在业务层次。

 

为什么使用框架

l  框架可以帮组我们快速、稳定、高效搭建程序系统

l 该系统由于框架的使用使得本身的维护性、灵活性、适应客户需求方面得到最大化的增强。

l 使用框架的过程中可以使得我们的注意力全部集中业务层面,而无需关心程序的底层架构。

 

【使用框架】


thinkphp.cn



thinkphp 3.2版本

 









 

【框架项目部署】


shop商城项目

book图书管理系统

car汽车销售系统

三个项目可以使用一个公共的tp框架。

 

步骤:

1. 创建一个入口文件index.php



2. 项目自动创建目录



3. 访问入口文件的同时系统会自动把对应的文件创建出来



 

【控制器和对应方法创建】


 



 

 

【路由解析】


通过url地址get参数找到指定的控制器,并进行对应方法调用请求

http://网址/index.php?m=模块名称&c=控制器&a=方法

以上url地址信息代码不够优雅、不安全。

 


tp框架url地址可以由以下四种

1. http://网址/index.php?m=XX&c=XX&a=XX   基本get模式

2. http://网址/index.php/模块/控制器/操作方法  路径模式pathinfo

3. http://网址/模块/控制器/操作方法           rewrite重写模式

4. http://网址/index.php?s=/模块/控制器/方法    兼容模式

 

具体url地址模式设置(配置文件ThinkPHP/Conf/convertion.php)

URL_MODEL  =  0/1/2/3  分别代表四种url地址模式

 



config.php是我们当前自己项目的配置文件,我们可以通过修改该文件达到配置变量的目录

这个文件在系统运行过程中会覆盖convertion.php的配置变量

include “convertion.php”;

include “config.php”;  后引入的文件要把先引入的文件配置变量给覆盖掉

 

我们系统有兼容4url地址模式的使用

系统有的时候会自动创建url地址,它会根据当前模式进行url地址创建使用

U();  创建url地址

 

在入口文件index.php调整当前模式为开发调试模式:



 

 

通过url地址模式我们学习到了以下内容:

1. 我们学习到了配置变量(核心配置变量conversion.php、当前应用配置变量config.php

2. 快捷函数U(“模块/控制器/方法”)  根据参数和url模式 创建对应的url地址

3. 把框架的模式调整为开发调试模式

 

 

 

【开发、生产模式】


开发调试模式:系统需要加载24个文件  index.php  define(“APP_DEBUG”,true);

生产模式:系统只需要加载很少的7个文件  index.php  define(“APP_DEBUG”,false);

节省了许多文件的开发、关闭的系统开销,节省资源



观察系统运行过程中生成的日志信息:

1. 做变量配置,convertion.php , config.php

2. tp框架配置变量:convertion.php   Behavior行为文件    程序灵活设置

Behavior  行为:ThinkPHP/Library/Behavior/*



$option里边的信息是可以直接通过config.php进行修改的



 



 

【控制器调用视图view模板】




控制器----》视图



APP_DEBUG = true;  调试模式错误信息显示更详细

 



控制器和模板的关系

通常:在view目录通常会有一个与控制器标志一样的目录,里边有具体模板文件

例如GoodsController.class.php 控制 在view目录有Goods目录,里边都是Goods控制器对应的模板文件

 

【视图模板与项目进行整合】


1. 引入静态代码

2. 引入cssimagejs

a) 以上3样东西,浏览器需要发送单独的http请求

b) 

引入css的时候,以User控制器标志作为当前目录,显然不行

 



以上目录设置不利于后期维护,例如其中的目录有修改,就需要全部都修改,有很多重复劳动

优化后:利用常量把路径给定义好,后期只维护一个常量即可



 

tp框架默认引擎的常量使用



 

模板与tp框架整合

1. 引入静态代码

2. 引入cssimgjs文件

3. 在入口文件地方把cssimgjs的路径设置常量

4. 在模板中通过常量获得具体的cssimg等文件信息(后期重复步骤)

5. 把css文件本身的图片路径设置正确(获得图片的相对位置是本身自己css文件)

 

url地址大小写设置】


config.php里边对url大小写敏感进行设置



引入文件:include “hello.php”;   include(“Hello.php”); 实际都会把指定文件找到hello.php

tp框架本身自己做了额外设置 :include (“hello.php”)  include “Hello.php”;  表示需要引入两个不同文件

 

总结:

1. 创建应用index.php入口文件

2. 创建控制器和视图模板

3. 控制器和真实模板进行整合(css  img  js

4. 配置文件:

a) convertion.php

b) config.php    shop/Common/Conf/config.php (针对所有分组模块都起作用)

c) config.php    shop/Home/Common/Conf/config.php  (针对Home分组模块起作用)

 

 

 

【空操作和空控制器使用】


空操作:就没有指定的操作方法

空控制器:没有指定控制器

http://网址/index.php/Home/User/login

http://网址/index.php/Home/User/hello 空操作

http://网址/index.php/Home/beijing/login   空控制器

 

空操作:


最新3.2.2版本,只需要在该类Controller下面定义一个_empty()方法即可

如:



<?php

namespace Home\Controller;

use Think\Controller;

class CityController extends Controller{

public function _empty($name){

//把所有城市的操作解析到city方法

$this->city($name);

}

 

//注意 city方法 本身是 protected 方法

protected function city($name){

//和$name这个城市相关的处理

echo '当前城市' . $name;

}

}





一般网站处于安全考虑不给用户提示任何错误信息

“空操作”本质意思:一个对象(控制器)调用本身不存在的方法

OOP里边,对象调用本身不存在方法,处于用户体验比较好的角度考虑,我们可以在类里边制作一个魔术方法:function __call();



 

普通控制器父类的位置:



 



空操作有两种解决方案:

① 在对应的控制器里边制作一个方法,名称为”_empty”,这个控制器的空操作都会自动执行该方法。(推荐使用)

② 给空操作的名称制作一个同名的模板出来,系统会自动调用

 



 

 


空控制器


http://网址/index.php/Home/tianjin/login



空控制器:在实例化控制器对象的时候,没有找到指定的类

什么时候实例化控制器对象:ThinkPHP/Library/Think/App.class.php

熟记文件:

index.php  入口文件

ThinkPHP/ThinkPHP.php  框架核心文件

ThinkPHP/Library/Think/Think.class.php  框架核心文件

ThinkPHP/Library/Think/App.class.php  框架应用文件

App.class.php内部包括控制器对象创建,以及对象调用指定的方法呈现内容。

 

快捷操作方法:



 



 

空控制器处理方案:制作一个空控制器,名称EmptyController.class.php

在该控制器内部其实只需要制作一个_empty()方法即可。



 

【项目分组】


系统有前台用户操作界面

系统还有后台供公司内部人员使用维护平台

两者在使用的过程中就是对“控制器”、“视图模板”、“model模型”的操作

 

为了系统开发方便,及代码部署更加合理,我们的控制器、view视图等前后台文件不要混在起,要在物理结构上给分开





http://网址/index.php/Home/控制器/操作方法     访问Home控制器及制定操作

http://网址/index.php/Admin/控制器/操作方法    访问Admin分组的控制器和操作方法

 

【后台登录页面与框架整合】


控制器:

ManagerController.class.php

function login()

为后台静态资源目录创建常量



 

 

【后台品字形框架页面搭建】


控制器:IndexController.class.php

操作方法:head()   left()   right()   index()





注意:framesrc属性通过独立路由进行设置

 

获得系统常量信息



 

 



以上错误信息是tp框架给我们封装好的错误信息,我们更喜欢看我们传统的错误信息

调整文件 ThinkPHP/Library/Think/Think.class.php内容如下:



把以上三行给注释掉,以后看到的错误就是传统的错误信息

 



行为:ThinkPHP/Library/Behavior/ContentReplaceBehavior.class.php进行的替换

 

【跨控制器调用】


一个控制器在执行的时候,可以实例化另外一个控制,并通过对象访问其指定方法。

跨控制器调用可以节省我们代码的工作量

例如:有10个页面,都要现实指定的数据信息显示。比如我们网站的“会员数目有200万”,这个信息需要在10个页面都显示

这个数据是通过UserController.class.php 里边额方法number()给查询出来的

现在商品列表页面也需要显示200万会员数目信息,那么原则上就是GoodsController.class.php里边也有一个方法number()专门获得会员数目的

如果许多页面都需要显示200万的会员数据,则许多控制器都需要有number()方法。

如果大家都能实例化User控制器,并调用它的number()方法,则会节省许多重复劳动。

 

系统函数库:ThinkPHP/Common/functions.php

 



A(“[模块/]控制器标志”) 实例化控制器对象

R([模块/]控制器标志/操作方法)  实例化对象同时调用指定方法

 

【框架执行流程分析】


tp框架内部代码集成:面向过程和OOP面向对象

 

1. index.php  入口文件

 

2. ThinkPHP/ThinkPHP.php

php5.3版本以后

设置常量有两种方式:

const name = value;  作用域根据当前命名空间决定

define()  作用域全局

① 定义了许多常量

② 引入核心文件Think.class.php

Think::start();

 

3. ThinkPHP/Library/Think/Think.class.php

static function start()

① 引入系统核心文件

② 引入配置文件

③ 如果是生成模式,还会生成common~runtime.php文件

④ 如果是第一次使用系统,还会自动创建对应的应用目录

App::run();

 

4. ThinkPHP/library/Think/App.class.php

static function run()

App::init();

路由解析

//路由解析,把模块、控制器、方法赋予常量

//MODULE_NAME = 模块名称

//CONTROLLER_NAME  控制器

//ACTION_NAME  方法

App::exec()

实例化控制器对象

利用“反射”实现对象调用方法

 

 

利用反射实现对象调用方法:



 

 

总结:

1. 空操作和空控制器处理

2. 模块项目分组Home   Admin

a) http://网址/index.php/模块/控制器/操作方法

3. 后台登陆和品字形框架frameset  frame src

4. 跨控制器调用

A()

R()

5. 执行流程分析(不要求)

 

作业:

1. 把商城模板 和 tp框架进行整合

2. 把商城模板 的后台在tp框架中搭建起来(模块项目分组Home Admin)

 

 

 

 

 

 

 

 

 

 

 

 

 

 


2 条评论: