一.生成入口文件
1.打开服务器,在本地环境测试时在地址栏输入localhost/项目文件名/index.php 可以在Application下面生成一个home模块,记得在这之前,要建立一个项目文件夹,并把项目文件夹放在www目录下,在项目文件夹里面解压下载的thinkphp框架,可以把home模块复制一下,模块名字改为Admin,从而搭建一个后台模块
2. 3.2版本的框架已经自带了一个应用入口文件(以及默认的目录结构),如果你改变了项目目录(例如把Application
更改为Apps
),只需要在入口文件更改APP_PATH常量定义即可:
define('APP_PATH','./Apps/');
require './ThinkPHP/ThinkPHP.php';
- .注意:APP_PATH的定义支持相对路径和绝对路径,但必须以“/”结束
3.可以单独定义一个THINK_PATH常量引入
和APP_PATH一样THINK_PATH路径定义也必须以“/”结尾。
给THINK_PATH和APP_PATH定义绝对路径会提高系统的加载效率。
二.对thinkPHP模块内容的基本操作
一.对控制器的操作:
1.在home文件夹的的控制器里有个默认的控制器IndexController.class.php,里面有个默认的index方法,注意控制器是驼峰法命名,首字母大写。
控制器文件的命名方式是:类名+class.php(类文件后缀)
2.一般来说,新建一个控制器后,都是这样的格式来写控制器里面的内容
namespace HomeController; //表示当前类是home下面的控制器
use ThinkController; //引入 ThinkController 命名空间便于直接使用,等同于
class IndexController extends ThinkController
class IndexController extends Controller {
public function index(){
echo '这是默认进入的方法';
}
}
三.thinkphp配置
1.配置一般都写在config文件夹里面,以php数组的方式返回,每个模块会自动加载自己的配置文件(位于Application/当前模块名/Conf/config.php
)
2.如果想要读取配置,用C方法读取C('参数名称'),配置参数是全局有效的
二维配置的读取:用'.',例如:C('USER_CONFIG.USER_TYPE');
3.还支持默认值的设置C('my_config',null,'default_config');#-------如果my_config尚未设置的话,则返回default_config。----#
四.架构
1.一个典型的URL访问规则是:http://serverName/index.php(或者其他应用入口文件)/模块/控制器/操作/[参数名/参数值...]
2.Common模块是一个特殊的模块,是应用的公共模块,里面有公共配置(Conf/config.php)和公共函数(Common/function.php),此模块不能通过URL直接访问
3.如果想生成一个Admin模块用于后台,可以在入口文件中做以下定义:
// 绑定Admin模块到当前入口文件
define('BIND_MODULE','Admin');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
4.如果需要生成更多的控制器类,可以定义BUILD_CONTROLLER_LIST
常量,例如:
// 绑定Admin模块到当前入口文件,此时的访问地址由
http://serverName/index.php/Admin/Index/index变成了http://serverName/index.php/Index/index
define('BIND_MODULE','Admin');
define('BUILD_CONTROLLER_LIST','Index,User,Menu');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
5.绑定控制器到当前的入口文件
// 绑定Home模块到当前入口文件,,此时的访问地址由http://serverName/index.php/Home/Index/index变成了
http://serverName/home.php/index
define('BIND_MODULE', 'Home');
define('BIND_CONTROLLER','Index'); // 绑定Index控制器到当前入口文件
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
6.URL模式
地址在Linux环境下会区分大小写,所以可以在配置里写'URL_CASE_INSENSITIVE' => true,当然,这个也是默认配置,但是你当开启调试模式的情况下,这个参数是false
ThinkPHP支持的URL模式有四种:普通模式、PATHINFO、REWRITE和兼容模式,可以设置URL_MODEL参数改变URL模式
URL模式 | URL_MODEL设置 |
---|---|
普通模式 | 0 |
PATHINFO模式 | 1(最常用) |
REWRITE模式 | 2 |
兼容模式 | 3 |
7.注册命名空间:用AUTOLOAD_NAMESPACE(如果定义了较多的命名空间的话,效率会有所下降,所以,我们可以给常用的类库定义类库映射。命名类库映射相当于给类文件定义了一个别名,效率会比命名空间定位更高效)
例如:'AUTOLOAD_NAMESPACE' => array(
'My' => THINK_PATH.'My',
'One' => THINK_PATH.'One'
)
四.路由
前提:URL支持PATH_INFO模式
开启路由:'URL_ROUTER_ON' => true,
1.在模块的配置文件中使用URL_ROUTE_RULES参数进行配置,配置格式是一个数组,每个元素都代表一个路由规则
例如;'URL_ROUTE_RULES'=>array(
'news/:year/:month/:day' => array('News/archive', 'status=1'),
'news/:id' => 'News/read',
'news/read/:id' => '/news/:1',
),
一旦匹配到的话,就会定位到路由定义中的控制器和操作方法去执行(可以传入其他的参数),并且后面的规则不会继续匹配。
'路由表达式'=>'路由地址和传入参数'或者:array('路由表达式','路由地址','传入参数')
表达式 | 示例 |
---|---|
正则表达式 | /^blog/(d+)$/ |
规则表达式 | blog/:id |
如果路由地址以“/”或者“http”开头则会认为是一个重定向地址或者外部地址
采用重定向到外部地址通常对网站改版后的URL迁移过程非常有用,默认情况下,外部地址的重定向采用301重定向
1.支持对变量的类型检测,但仅仅支持数字类型的约束定义,
例如;'blog/:idd'=>'Blog/read',表示只会匹配数字参数,如果你需要更加多的变量类型检测,请使用正则表达式定义来解决。
2.可以支持对路由变量的函数过滤,例如:'blog/:idd|md5'=>'Blog/read',
3.静态路由的路由地址 只支持字符串,格式:[控制器/操作?]参数1=值1&参数2=值2
五.控制器
1.基本的访问控制器的方法:(用A方法)
// 假设当前模块是Home模块
$User = A('User');
$Blog = A('Admin/Blog');
或:
$User = new HomeControllerUserController(); //尽量别用这个方法,使用上面的方法
2.控制器的前置和后置操作:
例如:<?php
namespace HomeController;
use ThinkController;
class IndexController extends Controller{
//前置操作方法_before_index是关键字
public function _before_index(){
echo '第一次输出这句话<br/>';
}
public function index(){
echo '第二次输出这句话<br/>';
}
//后置操作方法_after_index是关键字
public function _after_index(){
echo '第三次输出这句话<br/>';
}
}
前置和后置操作的注意事项如下:
1. 如果当前的操作并没有定义操作方法,而是直接渲染模板文件,那么如果定义了前置和后置方法的话,依然会生效。真正有模板输出的可能仅仅是当前的操作,前置和后置操作一般情况是没有任何输出的。
2. 需要注意的是,在有些方法里面使用了exit或者错误输出之类的话 有可能不会再执行后置方法了。例如,如果在当前操作里面调用了系统Action的error方法,那么将不会再执行后置操作,但是不影响success方法的后置方法执行。
3.控制器参数绑定
首先要开启参数绑定功能 'URL_PARAMS_BIND' => true, // URL变量绑定到操作方法作为参数
在控制器的方法里构造一个默认的参数并赋值:
例如:namespace HomeController;
use ThinkController;
class BlogController extends Controller{
public function read($id=0){
echo 'id='.$id;
}
public function archive($year='2013',$month='01'){
echo 'year='.$year.'&month='.$month;
}
}
URL的访问地址分别是:
http://serverName/index.php/Home/Blog/read/id/5
http://serverName/index.php/Home/Blog/archive/year/2013/month/11
如果使用下面的URL地址进行访问,参数绑定仍然有效:
http://serverName/index.php?s=/Home/Blog/read/id/5
http://serverName/index.php?s=/Home/Blog/archive/year/2013/month/11
http://serverName/index.php?c=Blog&a=read&id=5
http://serverName/index.php?c=Blog&a=archive&year=2013&month=11
如果不设置默认参数,访问地址
http://serverName/index.php/Home/Blog/read/将会抛出异常
4.URL的生成
用U方法生成地址:U('地址表达式',['参数'],['伪静态后缀'],['显示域名'])
地址表达式的格式定义如下:[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...
如果你是在模板文件中直接使用U方法的话,需要采用 {:U('参数1', '参数2'…)} 的方式
5.ajax返回
$this->ajaxReturn($data); //返回数据data可以支持字符串、数字和数组、对象,返回客户端的时候根据不同的返回格式进行编码后传输。
6.页面跳转和重定向
//设置成功后跳转页面的地址,默认的返回页面是$_SERVER['HTTP_REFERER']
$this->success('新增成功', 'User/list');
//错误页面的默认跳转页面是返回前一页,通常不需要设置(error方法的默认跳转地址是javascript:history.back(-1);
)
$this->error('新增失败');
success和error方法的第一个参数表示提示信息,第二个参数表示跳转地址,第三个参数是跳转时间(单位为秒)
例如:$this->success('操作完成','/Article/index',3);
默认的等待时间success方法是1秒,error方法是3秒
7.输入变量
I方法是ThinkPHP用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:
I('变量类型.变量名/修饰符',['默认值'],['过滤方法'],['额外数据源'])
变量类型 | 含义 |
---|---|
get | 获取GET参数 |
post | 获取POST参数 |
param | 自动判断请求类型获取GET、POST或者PUT参数 |
request | 获取REQUEST 参数 |
put | 获取PUT 参数 |
session | 获取 $_SESSION 参数 |
cookie | 获取 $_COOKIE 参数 |
server | 获取 $_SERVER 参数 |
globals | 获取 $GLOBALS参数 |
path | 获取 PATHINFO模式的URL参数(3.2.2新增) |
data | 获取 其他类型的参数,需要配合额外数据源参数(3.2.2新增) |
例如:echo I('get.id',0); // 如果不存在$_GET['id'] 则返回0
// 采用htmlspecialchars方法对$_GET['name'] 进行过滤,如果不存在则返回空字符串
echo I('get.name','','htmlspecialchars');
// 获取整个$_GET 数组
I('get.');
变量的过滤默认设置为
// 系统默认的变量过滤机制
'DEFAULT_FILTER' => 'htmlspecialchars'
// 下面两种方式都不采用任何过滤方法(一旦过滤参数设置为空字符串或者false,即表示不再进行任何的过滤)
I('get.name','',''); 和
I('get.id','',false);
3.2.3版本开始,I函数支持对变量使用修饰符功能,可以更好的过滤变量。
例如:I('get.id/d');
可以使用的修饰符包括:
修饰符 | 作用 |
---|---|
s | 强制转换为字符串类型 |
d | 强制转换为整形类型 |
b | 强制转换为布尔类型 |
a | 强制转换为数组类型 |
f | 强制转换为浮点类型 |
8.请求类型的判断
常量 | 说明 |
---|---|
IS_GET | 判断是否是GET方式提交 |
IS_POST | 判断是否是POST方式提交 |
IS_PUT | 判断是否是PUT方式提交 |
IS_DELETE | 判断是否是DELETE方式提交 |
IS_AJAX | 判断是否是AJAX提交 |
REQUEST_METHOD | 当前提交类型 |
例如:if(IS_GET){
}
9.空操作
空操作是指系统在找不到请求的操作方法的时候,会定位到空操作(_empty
)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化。
在一个控制器里定义一个空方法的方式:
public function _empty($name){
//要执行的操作
}
10.空控制器
空控制器的概念是指当系统找不到请求的控制器名称的时候,系统会尝试定位空控制器(EmptyController),利用这个机制我们可以用来定制错误页面和进行URL的优化。
例如:可以定义一个空控制器,然后让其它的控制器继承这个空控制器
六、模型类
模型类的作用大多数情况是操作数据表的,如果按照系统的规范来命名模型类的话,大多数情况下是可以自动对应数据表。模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型层的名称(默认定义是Model)
1.模型类的定义:
namespace HomeModel;
use ThinkModel;
class UserModel extends Model {
}
如果模型名字和表的名字不相符:一般在模型里面来设置变量进行操作,用tablePrefix关键字,如果未定义则获取配置文件中的DB_PREFIX参数
例如:namespace HomeModel;
use ThinkModel;
class CategoryModel extends Model {
protected $tableName = 'categories'; //假设现在的数据表名称是think_categories,配置中已经设置过表前缀
}
其它操作:
属性 | 说明 |
---|---|
tablePrefix | 定义模型对应数据表的前缀,如果未定义则获取配置文件中的DB_PREFIX参数 |
tableName | 不包含表前缀的数据表名称,一般情况下默认和模型名称相同,只有当你的表名和当前的模型类的名称不同的时候才需要定义。 |
trueTableName | 包含前缀的数据表名称,也就是数据库中的实际表名,该名称无需设置,只有当上面的规则都不适用的情况或者特殊情况下才需要设置。 |
dbName | 定义模型当前对应的数据库名称,只有当你当前的模型类对应的数据库名称和配置文件不同的时候才需要定义。 |
2.模型实例化
系统提供了一个快捷方法D用于数据模型的实例化操作。
D方法的参数就是模型的名称,并且和模型类的大小写定义是一致的
D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化系统的ThinkModel基类,同时对于已实例化过的模型,不会重复去实例化。
D方法实例化模型类的时候通常是实例化某个具体的模型类,如果你仅仅是对数据表进行基本的CURD操作的话,使用M方法实例化的话,由于不需要加载具体的模型类,所以性能会更高。我们在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法。
M方法也可以支持跨库操作,例如:
// 使用M方法实例化 操作db_name数据库的ot_user表
$User = M('db_name.User','ot_');
// 执行其他的数据操作
$User->select();
实例化空模型类:如果你仅仅是使用原生SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作了,例如:
//实例化空模型
$Model = new Model();
//或者使用M快捷方法是等效的
$Model = M();
//进行原生的SQL查询
$Model->query('SELECT * FROM think_user WHERE status = 1');
字段定义:如果不希望依赖字段缓存或者想提高性能,也可以在模型类里面手动定义数据表字段的名称,可以避免IO加载的效率开销
namespace HomeModel;
use ThinkModel;
class UserModel extends Model {
protected $fields = array('id', 'username', 'email', 'age');
protected $pk = 'id'; //pk
属性定义当前数据表的主键名,默认值就是id,因此如果是id的话可以无需定义。
}
链接数据库:如果是3.2.3版本的话,由于全部采用PDO方式,所以DB_TYPE需要配置为实际的数据库类型,不再支持设置为PDO,也不再区分mysql和mysqli。
dsn参数设置:数据库类型://用户名:密码@数据库地址:数据库端口/数据库名#字符集
'DB_DSN' => 'mysql://root:123456@localhost:3306/thinkphp#utf8'
或:数据库全局配置方式:
1.'DB_TYPE' => 'mysql', // 数据库类型
2.
'DB_HOST' => 'localhost', // 服务器地址
3.'DB_NAME' => 'thinkphp', // 数据库名
4.
'DB_NAME' => 'thinkphp', // 数据库名
5.
'DB_USER' => 'root', // 用户名
6.
'DB_PWD' => '123456', // 密码
7.
'DB_PORT' => 3306, // 端口
8.
'DB_PREFIX' => 'think_', // 数据库表前缀
9.
'DB_CHARSET'=> 'utf8', // 字符集
10.
'DB_DEBUG' => TRUE, // 数据库调试模式 开启后可以记录SQL日志 3.2.3新增