ThinkPHP3.1基础知识快速入门
在当今众多的mvc框架中,thinkphp是一个快速、简单的基于mvc和面向对象的轻量级php开发框架,其遵循apache2开源协议发布,自从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,尤其注重开发体验及易用性,并且拥有众多的原创功能和特性,为web应用开发提供了强有力的支持。是众多php开发人员的首选。本文就thinkphp3.1基础知识做一简述。
1.目录结构
thinkphp最新版本可以在官方网站(http://thinkphp.cn/down/framework.html)或者github(https://github.com/liu21st/thinkphp/downloads)下载。
把下载后的压缩文件解压到你的web目录(或者任何目录都可以),框架的目录结构为:
├─thinkphp.php 框架入口文件 ├─common 框架公共文件 ├─conf 框架配置文件 ├─extend 框架扩展目录 ├─lang 核心语言包目录 ├─lib 核心类库目录 │ ├─behavior 核心行为类库 │ ├─core 核心基类库 │ ├─driver 内置驱动 │ │ ├─cache 内置缓存驱动 │ │ ├─db 内置数据库驱动 │ │ ├─taglib 内置标签驱动 │ │ └─template 内置模板引擎驱动 │ └─template 内置模板引擎 └─tpl 系统模板目录
注意,框架的公共入口文件thinkphp.php是不能直接执行的,该文件只能在项目入口文件中调用才能正常运行(后面会讲到),这是很多新手很容易犯的一个错误。
2.入口文件
在开始之前,你需要一个web服务器和php运行环境,如果你暂时还没有,我们推荐使用集成开发环境wampserver(是一个集成了apache、php和mysql的开发套件,而且支持多个php版本、mysql版本和apache版本的切换)来使用thinkphp进行本地开发和测试。
接下来我们先在web根目录下面创建一个app子目录(这个app就是我们的项目名),然后在该目录下面创建一个index.php文件,添加一行简单的代码:
<?php require '/thinkphp框架所在目录/thinkphp.php';
这行代码的作用就是加载thinkphp框架的入口文件thinkphp.php,这是所有基于thinkphp开发应用的第一步。
然后,在浏览器中访问这个入口文件。
http://localhost/app/
一般web服务器的默认文件是index.php,所以我们可以不需要在url地址中加上index.php。运行后我们会看到欢迎页面,
而且已经自动生成了项目目录,目录结构如下:
├─index.php 项目入口文件 ├─common 项目公共文件目录 ├─conf 项目配置目录 ├─lang 项目语言目录 ├─lib 项目类库目录 │ ├─action action类库目录 │ ├─behavior 行为类库目录 │ ├─model 模型类库目录 │ └─widget widget类库目录 ├─runtime 项目运行时目录 │ ├─cache 模板缓存目录 │ ├─data 数据缓存目录 │ ├─logs 日志文件目录 │ └─temp 临时缓存目录 └─tpl 项目模板目录
如果你希望项目的入口文件移动到app目录的外面,那么只需要修改入口文件index.php的内容为:
<?php define('app_name','app'); define('app_path','./app/'); require '/thinkphp框架所在目录/thinkphp.php';
app_name和app_path分部用于定义项目名和项目目录,项目名通常就是指项目的目录名称。
移动并修改完项目的入口文件后,我们就可以通过
http://localhost/
访问app项目了。当然你也可以在web根目录下面创建多个子目录来部署多个项目。
3.调试模式
thinkphp的运行模式包括调试模式和部署模式,默认情况下是运行在部署模式下面。部署模式下面性能优先,并且尽可能少地抛出错误信息,调试模式则以除错方便优先,关闭任何缓存,而且尽可能多的抛出错误信息,所以对性能有一定的影响。部署模式采用了项目编译机制,第一次运行会对核心和项目相关文件进行编译缓存,由于编译后会影响开发过程中对配置文件、函数文件和数据库修改的生效(除非你修改后手动清空runtime下面的缓存文件)。因此为了避免以上问题,我们强烈建议新手在使用thinkphp开发的过程中使用调试模式,这样可以更好的获取错误提示和避免一些不必要的问题和烦恼。
开启调试模式很简单,我们只需要在入口文件的开头加上一行常量定义代码:
<?php define('app_debug',true); // 开启调试模式 require '/thinkphp框架所在目录/thinkphp.php';
开发完成后,我们实际进行项目部署的时候,删除这行常量定义代码即可,或者改成:
define('app_debug',false); // 关闭调试模式
4.配置
每个项目都有一个独立的配置文件(位于项目目录的conf/config.php),配置文件的定义格式均采用php返回数组的方式,例如:
// 项目配置文件 return array( '配置参数' => '配置值', // 更多配置参数 //... );
一旦有需要,我们就可以在项目配置文件中添加相关配置项目。通常我们提到的添加配置项目,就是指在项目配置文件中添加:
'配置参数' => '配置值',
配置值可以支持包括字符串、数字、布尔值和数组在内的数据,通常我们建议配置参数均使用大写定义。如果有需要,我们还可以为项目定义其他的配置文件。
5.控制器
需要为每个模块定义一个控制器类,控制器类的命名规范是:
模块名+action.class.php (模块名采用驼峰法并且首字母大写)
系统的默认模块是index,对应的控制器就是项目目录下面的lib/action/indexaction.class.php,类名和文件名一致。默认操作是index,也就是控制器的一个public方法。初次生成项目目录结构的时候,系统已经默认生成了一个默认控制器(就是之前看到的欢迎页面),我们把index方法改成下面的代码:
class indexaction extends action { public function index(){ echo 'hello,world!'; } }
控制器必须继承action类,一个模块可以包括多个操作方法。如果你的操作方法是protected或者private类型的话,是无法直接通过url访问到该操作的。
6.url请求
入口文件是项目的单一入口,对项目的所有请求都定向到项目的入口文件,系统会从url参数中解析当前请求的模块和操作,我们之前访问的url地址中没有任何参数,因此系统会访问默认模块(index)的默认操作(index),因此下面的访问和之前是等效的:
http://localhost/app/index.php/index/index
这种url模式就是系统默认的pathinfo模式,不同的url模式获取模块和操作的方法不同,thinkphp支持的url模式有四种:普通模式、pathinfo、rewrite和兼容模式。
普通模式:也就是传统的get传参方式来指定当前访问的模块和操作,例如:
http://localhost/app/?m=module&a=action&var=value
m参数表示模块,a操作表示操作(模块和操作的url参数名称是可以配置的),后面的表示其他get参数。
pathinfo模式:是系统的默认url模式,提供了最好的seo支持,系统内部已经做了环境的兼容处理,所以能够支持大多数的主机环境。对应上面的url模式,pathinfo模式下面的url访问地址是:
http://localhost/app/index.php/module/action/var/value/
pathinfo地址的第一个参数表示模块,第二个参数表示操作。
pathinfo模式下面,url是可定制的,例如,通过下面的配置:
'url_pathinfo_depr'=>'-', // 更改pathinfo参数分隔符
我们还可以支持下面的url访问:
http://localhost/app/index.php/module-action-var-value/
rewrite模式:是在pathinfo模式的基础上添加了重写规则的支持,可以去掉url地址里面的入口文件index.php,但是需要额外配置web服务器的重写规则。
如果是apache则需要在入口文件的同级添加.htaccess文件,内容如下:
<ifmodule mod_rewrite.c> rewriteengine on rewritecond %{request_filename} !-d rewritecond %{request_filename} !-f rewriterule ^(.*)$ index.php/$1 [qsa,pt,l] </ifmodule>
接下来,就可以用下面的url地址访问了:
http://localhost/app/module/action/var/value/
兼容模式:是用于不支持pathinfo的特殊环境,url地址是:
http://localhost/app/?s=/module/action/var/value/
兼容模式配合web服务器重写规则的定义,可以达到和rewrite模式一样的url效果。
7.视图
thinkphp内置了一个编译型模板引擎,也支持原生的php模板,并且还提供了包括smarty在内的模板引擎驱动。和smarty不同,thinkphp在渲染模板的时候如果不指定模板,则会采用系统默认的定位规则,其定义规范是 tpl/模块名/操作名.html,所以,index模块的index操作的默认模板文件位于项目目录下面的tpl/index/index.html。
例如:
<html> <head> <title>hello {$name}</title> </head> <body> hello, {$name}! </body> </html>
要输出视图,必须在控制器方法中进行模板渲染输出操作,例如:
class indexaction extends action { public function index(){ $this->name = 'thinkphp'; // 进行模板变量赋值 $this->display(); } }
display方法中我们没有指定任何模板,所以按照系统默认的规则输出了index/index.html模板文件。
接下来,我们在浏览器中输入
http://localhost/app/
浏览器中会输出
hello,thinkphp!
8.读取数据
在开始之前,我们首先在数据库thinkphp中创建一个think_data数据表(以mysql数据库为例):
create table if not exists `think_data` ( `id` int(8) unsigned not null auto_increment, `data` varchar(255) not null, primary key (`id`) ) engine=myisam default charset=utf8 ; insert into `think_data` (`id`, `data`) values (1, 'thinkphp'), (2, 'php'), (3, 'framework');
如果我们需要读取数据库中的数据,就需要在项目配置文件中添加数据库连接信息如下:
// 添加数据库配置信息 'db_type' => 'mysql', // 数据库类型 'db_host' => 'localhost', // 服务器地址 'db_name' => 'thinkphp', // 数据库名 'db_user' => 'root', // 用户名 'db_pwd' => '', // 密码 'db_port' => 3306, // 端口 'db_prefix' => 'think_', // 数据库表前缀
或者采用如下配置
'db_dsn' => 'mysql://root@localhost:3306/thinkphp'
使用db_dsn方式定义可以简化配置参数,dsn参数格式为:
数据库类型://用户名:密码@数据库地址:数据库端口/数据库名
如果两种配置参数同时存在的话,db_dsn配置参数优先。
接下来,我们修改下控制器方法,添加读取数据的代码:
class indexaction extends action { public function index(){ $data = m('data'); // 实例化data数据模型 $this->data = $data->select(); $this->display(); } }
这里用到了m函数,是thinkphp内置的实例化模型的方法,而且用m方法实例化模型不需要创建对应的模型类,你可以理解为m方法是直接在操作底层的model类,而model类具备基本的curd操作方法。
m('data') 实例化后,就可以对think_data数据表(think_ 是我们在项目配置文件中定义的数据表前缀)进行操作(包括curd)了,m函数的用法还有很多,我们以后会深入了解。
定义好控制器后,我们修改模板文件,添加数据输出标签如下:
<html> <head> <title>select data</title> </head> <body> <volist name="data" id="vo"> {$vo.id}--{$vo.data}<br/> </volist> </body> </html>
volist标签是内置模板引擎用于输出数据集的标签。{$vo.id} 和 {$vo.data} 的用法和smarty类似,就是用于输出数据的字段,这里就表示输出think_data表的id和data字段的值。
我们访问
http://localhost/app/
会输出
1--thinkphp 2--php 3--framework
如果发生错误,检查你是否开启了调试模式或者清空runtime目录下面的缓存文件。
如果你看到了上面的输出结果,那么至此你已经掌握了thinkphp入门的基础知识!
总结:
本篇我们学习了thinkphp的目录结构、url模式,如何创建项目的入口文件和开启调试模式,以及控制器、模板和模型的基础认识。