跟着视频做的笔记,不一定工整,根据目录查看比较合适
本来打算跟着视频学,但是视频课程太多,讲的很详细,不过最后还是边做边参考文档,好在之前有写过.NET和JAVA,一些东西知道怎么查文档,而且TP5是中文的文档所以也不吃力
用TP5做了一个电商项目 GitHub源码
开启调试模式
application\config.php
文件
// 应用调试模式
'app_debug' => true,
开始调试模式后不会隐藏错误报告
控制器
- 控制器的文件名必须首字母大写
- 控制中必须声明命名空间
与目录有关,app\模块名\controller - 控制器中类名必须与文件名一致
新建方法(操作)
在控制器中新建方法
模型(model)
与数据库相关的方法
新建后台模块
- 在application目录下新建admin目录
- 在admin目录下新建mode、view、controller目录
- 在controller目录新建Index.php文件
- 在文件中Index控制器中书写代码
<?php
//声明命名空间
namespace app\admin\controller
//声明控制器
class Index{
public function index(){
/* code */
}
}
- 通过地址栏访问
localhost/tp5/index.php/Admin/Index/index
调用当前控制器的方法
public test(){
return "我是test方法";
}
public fun(){
echo $this->test();
echo $self::test();
echo 当前控制器名::test();
//系统方法
echo action('test');
}
跨控制器调用方法
调用当前模块的方法
控制器中新建方法 “diaoyong”
public function diaoyong(){
// 不使用use
$model = new \app\模块名\controller\控制器名(类名);
echo $model->方法名();
// 使用use 声明 `use \app\模块名\controller\控制器名(类名);`
$model = new 控制器名(类名);
echo $model->方法名();
// 使用controller系统方法
$model = controller('控制器名(类名)');
echo $model->方法名();
// 使用action系统方法
echo action('控制器名/方法名')
}
调用后台(其他)模块的方法
控制器中新建方法 “diaoyongs”
public function diaoyong(){
// 不使用use
$model = new \app\模块名\controller\控制器名(类名);
echo $model->方法名();
// 使用use 声明 `use \app\模块名\controller\控制器名(类名);`
// 控制器重名时 使用别名 `use \app\模块名\controller\控制器名(类名) as OtherName`;
$model = new OtherName();
echo $model->方法名();
// 使用controller系统方法
$model = controller('模块名/控制器名(类名)');
echo $model->方法名();
// 使用action系统方法
echo action('模块名/控制器名/方法名')
}
系统方法一般位于 thinkphp\helper.php 中
TP大致执行流程
- 入口文件 (public\index.php)
- 定义目录常量
- 加载框架的引导目录 (thinkphp\start.php)
- 加载框架的基础引导文件 (thinkphp\base.php)
- 加载系统常量
- 引入loader类 (thinkphp\library\think\Loader.php)
- 引入环境变量
- 注册自动加载机制 (thinkphp\library\think\Loader.php)
- 注册异常处理机制 (thinkphp\library\think\Error.php)
- 加载惯例配置 (thinkphp\convention.php)
- 运行应用 (thinkphp\library\think\App.php) 的run方法
- 加载当前控制器中的 initCommon() 方法
- 加载当前控制器中的 init()
- 加载各种配置文件
- 加载公共文件
- 加载语言包
- 设置时区
- 加载当前控制器中的 init()
- 加载当前控制器 routeCheck() 方法路由检测
- 调用当前控制器中的 exec() 方法
- 根据用户的请求,进行分发处理
- 根据不同请求类型加载对应文件,当前情况为module,执行module方法
- module中加载对应控制器和对应方法
- 输出数据到客户端
- 用户看到的所有界面就加载出来了
- 加载当前控制器中的 initCommon() 方法
- 加载框架的基础引导文件 (thinkphp\base.php)
TP5.0 配置
配置文件格式
- ThinkPHP支持多种格式的配置格式,但最终都是解析为PHP数组的方式。
- 对于数组形式,形如
return [
'name' =>'',
'age' =>'',
'people' => [
'name' =>'',
'age' =>'',
'sex' =>'',
],
];
配置的形式
- 惯例配置 (thinkphp\convention.php)
一般不要修改惯例配置 - 应用配置 (application\config.php)
扩展配置
- 是对配置文件进行分目录的管理
- 默认两个扩展配置
(application\database.php) 数据库配置文件
(application\extra) 用户可以自定义配置文件 - 读取database扩展配置
dump(config('database.password'));
读取所有database配置
dump(config('database'));
自定义扩展配置
在扩展目录下 (application\extra) 新建user.php<?php return [ "name"=>"", "age"=>"", "love"=>"", ];
场景配置
- 解决问题
开发过程可能不同环境下进行开发 - 如何使用
- 修改应用配置 (application\config.php)
‘app_status’ => ‘home’, - 在应用目录下新建 (application) home.php
- 在home.php编写配置
- 读取场景配置
- 修改应用配置 (application\config.php)
- 解决问题
模块配置
- 解决问题
每个模块,都具有特有的配置 - 如何使用(以前台模块为例)
- 在前台模块下 (application\index) 新建config.php
- 编辑文件
- 读取配置
php
dump(config('index'));
- 解决问题
动态配置
在控制器中的临时配置... //控制器体 public function setConfig(){ dump(config('name')); // 先观察目前值 //系统方法 //参数1: 字段名 参数2: 值 config('name','tp5'); //系统类 \think\Config::set('name','php'); //或者使用use \think\Config Config::set('name','TP5php'); echo Config::get('name'); } //控制器体 ...
读取配置文件
public function getConfig(){
// 通过系统方法
echo config('配置字段名');
// 打印所有配置
dump(config());
// 通过系统类
// 可以使用命名空间
// 如果配置项不存在,则返回NULL
echo \think\Config::get('字段名');
// 使用use
use \think\Config;
echo Config::get('字段名');
}
读取数组配置则将字段名改为 数组名.字段名
配置文件之间优先级
动态配置>模块配置>场景配置>扩展配置>应用配置>惯例配置
则配置文件加载顺序为优先级从低到高
后加载的配置,对加载过的配置进行同名覆盖
环境变量配置
- TP5.0 才支持环境变量配置
设置环境变量配置
- 打开网站根目录(项目根目录) 新建 “.env” 文件(windows 下无法直接创建,可通过编辑器创建)
书写环境配置(不支持中文字符)
name = lazyslepp age = 8 sex = man // 定义数组类型 [mydatabase] type = mysql root = root pass = pass
读取环境变量
// 系统类 dump(\think\Env::get('name')); // use \think\Env // 可以给定默认值 dump(Env::get('other','找不到')); // 读取数组 dump(Env::get('mydatabase.type')); dump(Env::get('mydatabase.root')); // 不可以直接读取数组 // 如: // dump(Env::get('mydatabase'));
何时使用?在任意配置文件中
use \think\Env; return [ // 其他 app_debug => Env::get('app_debug',false), // 其他 ];
这样可以将常常需要修改的配置,放入环境变量中统一修改,不需要每次打开各种配置文件修改配置
入口文件和路由优化
路由作用
- 简化URL地址
- 利于搜索引擎发现
入口文件
前后台分离(新建入口文件)
在public路径下复制粘贴index.php文件并更名为admin.php
绑定模块
- 实现功能
- index.php 这个入口文件 只能去前台模块
- admin.php 这个入口文件 只能去后台模块
- 如何实现
在入口文件中的加载框架引导文件之前
绑定前台模块
define("BIND_MODULE","index")
绑定后台模块
define("BIND_MODULE","admin")
URL地址变化
- 绑定前
localhost/…/public/index.php/模块/控制器/方法 - 绑定后
localhost/…/public/index.php/控制器/方法
建议后台入口模块名复杂,防止一部分用户误打开
- 绑定前
隐藏入口文件
- 开启apache的重写 (httpd.conf)
去除注释
LoadModule rewrite_module modules/mod_rewrite.so - 设置访问权限
AllowOverride All 入口文件,在网站public目录下新建.htaccesss
<IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] </IfModule>
代码中倒数第二行配置了默认添加index.php,因此默认访问前台
- URL地址变化 (仅前台)
- 隐藏前
localhost/…/public/index.php/控制器/方法 - 隐藏后
localhost/…/public/控制器/方法
- 隐藏前
TP5.0 路由需要注意的
- 支持三种路由规则
- 路由只针对应用,不针对模块,因此路由的设置也是针对应用下面的所有模块
- 关闭模块路由
在需要关闭的模块的入口文件后面加\think\App::route(false);
必须写在 加载框架引导文件之后
路由模式
普通模式
- 定义
关闭路由,完全使用默认的 PATH_INFO 方式URL - 形式
localhost/…/public/index.php/控制器/方法 - 设置方法 (application\config.php)
// 是否开启路由
'url_route_on' => false,
// 是否强制使用路由
'url_route_must' => false,
混合模式
- 定义
开启路由,并使用路由定义+默认的 PATH_INFO 方式的混合 - 设置方法 (application\config.php)
// 是否开启路由
'url_route_on' => true,
// 是否强制使用路由
'url_route_must' => false,
强制模式
- 定义
开启路由,并设置必须定义路由才能访问 - 设置方法 (application\config.php)
// 是否开启路由
'url_route_on' => true,
// 是否强制使用路由
'url_route_must' => true,
设置路由 (application\route.php)
Route::rule(‘路由表达式’,’路由地址’,’请求类型’,’路由参数(数组)’,’变量规则(数组)’);
动态单个注册
设置路由文件 (application\route.php) 编辑内容
// 引入系统类 use think\Route; // 定义路由规则 // 设置路由之后就不可以使用PATH_INFO访问 // 注册路由 访问到Index模块index控制器index方法 Route::rule('/','index/index/index'); // 注册路由 访问到Index模块index控制器test方法 Route::rule('test','index/index/test');
路由的形式
- 静态地址路由
注册路由test 访问到Index模块index控制器test方法
Route::rule('test','index/index/test');
带参数的路由
注册带参数路由
localhost/…/public/couser/1
localhost/…/public/index/index/index/1
Route::rule('course/:id','index/index/course');
在course方法中
echo input('id');
如果路由设置两个参数,必须带两个参数
localhost/…/public/time/2018/5
Route::rule('time/:year/:month','index/index/mytime');
可选参数则可写为
Route::rule('time/:year/[:month]','index/index/mytime');
在mytime方法中
echo input('year')." ".input('month');
全动态路由 (不建议使用)
若动态参数与之前设置的匹配则优先匹配之前设置的路由
Route::rule(':a/:b','index/index/dongtai');
完全匹配路由,加$符号
localhost/…/public/test1 可以成功访问
localhost/…/public/test1/other/other 不能访问
Route::rule('test1$','index/index/test1');
带额外参数
localhost/…/public/test2 访问时则get了id和name参数
可以在方法中通过打印input()查看
Route::rule('test2','index/index/test2?id=10&name=lazysleep');
设置请求类型
- TP中请求类型
GET POST PUT DELETE 设置路由请求方式
默认支持所有请求类型
设置只能通过get请求
Route::rule('type','index/index/type','GET');
or
Route::get('type','index/index/type');
同时支持get post
Route::rule('type','index/index/type','GET|POST');
or
Route::get('type','index/index/type');
Route::post('type','index/index/type');
支持所有
Route::rule('type','index/index/type','*');
or
Route::any('type','index/index/type');
- TP中请求类型
- 静态地址路由
动态批量注册
Route::rule([
"test"=>"index/index/index",
"course/:id"=>"index/index/course"
],'','GET');
or
`Route::get([
"test"=>"index/index/index",
"course/:id"=>"index/index/course"
]);`
配置文件批量注册
直接返回数组 (application\route.php)
return [
"test"=>"index/index/index",
"course/:id"=>"index/index/course"
];
变量规则
Route::rule(‘路由表达式’,’路由地址’,’请求类型’,’路由参数(数组)’,’变量规则(数组)’);
id用正则表达式限定为数字
Route::rule("course/:id","index/index/course",'GET',[],['id'=>'\d{1,3}']);
路由参数
Route::rule(‘路由表达式’,’路由地址’,’请求类型’,’路由参数(数组)’,’变量规则(数组)’);
参数 | 说明 |
---|---|
method | 请求类型检测,支持多个请求类型 |
ext | URL后缀检测,支持匹配多个后缀 |
deny_ext | URL禁止后缀检测,支持匹配多个后缀 |
https | 检测是否https请求 |
domain | 域名检测 |
before_behavior | 前置行为(检测) |
after_behavior | 后置行为(执行) |
callback | 自定义检测方法 |
merge_extra_vars | 合并额外参数 |
bind_model | 绑定模型( V5.0.1+ ) |
cache | 请求缓存( V5.0.1+ ) |
param_depr | 路由参数分隔符( V5.0.2+ ) |
ajax | Ajax检测( V5.0.2+ ) |
pjax | Pjax检测( V5.0.2+ ) |
V5.0.3+ 版本对 ajax / pjax / https 条件支持 false 。
这些路由参数可以混合使用,只要有任何一条参数检查不通过,当前路由就不会生效,继续检测后面 的路由规则。
eg:
请求方式必须是GET
后缀必须是html
Route::rule("course/:id","index/index/course",'GET',['method'=>"GET","ext"=>"html"]);
资源路由
声明方式
Route::resource('blog','index/blog');
声明资源路由后会自动生成七个路由 增删改查等等
标识 | 请求类型 | 生成路由规则 | 对应操作方法(默认) |
---|---|---|---|
index | GET | blog | index |
create | GET | blog/create | create |
save | PUT | blog | blog/:id |
read | GET | blog/:id | read |
edit | GET | blog/:id/edit | edit |
update | PUT | blog/:id | update |
delete | DELETE | blog/:id | delete |
具体指向的控制器由路由地址决定,例如上面的设置,会对应index模块的blog控制器,你只需要为Blog 控制器创建以上对应的操作方法就可以支持下面的URL访问:
eg:
namespace app\index\controller;
class Blog {
public function index(){
}
public function read($id){
}
public function edit($id){
}
}
快捷路由
给User控制器设置快捷路由
Route::controller('user','index/User');
namespace app\index\controller; class User {
public function getInfo() { }
public function getPhone() { }
public function postInfo() { }
public function putInfo() { }
public function deleteInfo() { }
}
我们可以通过下面的URL访问
get -> http://localhost/user/info
get -> http://localhost/user/phone
post -> http://localhost/user/info
put -> http://localhost/user/info
delete -> http://localhost/user/info
URL生成
语法
think\Url::build('index/index/test');
or use think\Url
Url::build('index/index/test');
Url('index/index/test');
若使用了路由则返回路由的Url
带参数的url
url('index/index/test',['id'=>10,'name'=>"张三"]);
控制器初始化
创建的注意事项
- 控制器名字首字母大写,驼峰命名法
- 控制器名字和文件名相同
- 命名空间必须和文件名对应
eg:
namespace app\index\controller
Path\application\index\controller - 控制器名字采用驼峰命名时,如
UserInfo.php
则url应为localhost/…/public/Index/user_info/index
控制器如何加载页面
系统View类
$view = new \think\View; return $view->fetch();
系统Controller类
use think\Controller;
类继承Controller
方法中return $this->fetch();
系统函数
return View();
数据输出
- 输出字符串
直接return 字符串; - 输出数组
转换成字符串(JSON字符串) - 返回html代码
控制器初始化方法
控制器类中继承系统控制器Controller
实现方法 public function _initialize() 在调用任意控制器方法时会自动调用初始化方法
控制器前置方法
定义属性$beforeActionList
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
/*
['except' => '方法名,方法名']
表示这些方法不使用前置方法,
['only' => '方法名,方法名']
表示只有这些方法使用前置方法。
*/
protected $beforeActionList = [
'first',
'second' => ['except'=>'hello'],
'three' => ['only'=>'hello,data'],
];
protected function first()
{
echo 'first<br/>';
}
protected function second()
{
echo 'second<br/>';
}
protected function three()
{
echo 'three<br/>';
}
public function hello()
{
return 'hello';
}
public function data()
{
return 'data';
}
}
页面跳转
在应用开发中,经常会遇到一些带有提示信息的跳转页面,例如操作成功或者操作错误页面,并且自动跳转到另外一个目标页面。系统的\think\Controller类内置了两个跳转方法success和error,用于页面跳转提示。
使用方法很简单,举例如下:
namespace app\index\controller;
use think\Controller;
use app\index\model\User;
class Index extends Controller
{
public function index()
{
$User = new User; //实例化User对象
$result = $User->save($data);
if($result){
//设置成功后跳转页面的地址,默认的返回页面是$_SERVER['HTTP_REFERER']
$this->success('新增成功', 'User/list');
} else {
//错误页面的默认跳转页面是返回前一页,通常不需要设置
$this->error('新增失败');
}
}
}
跳转地址是可选的,success方法的默认跳转地址是$_SERVER[“HTTP_REFERER”],error方法的默认跳转地址是javascript:history.back(-1);。
修改跳转页面模板
模板文件位于thinkphp\tpl\dispatch_jump.tpl
会传入文件几个变量
变量 | 含义 |
---|---|
$data | 要返回的数据 |
$msg | 页面提示信息 |
$code | 返回的code,成功返回1,失败返回0 |
$wait | 跳转等待时间单位为秒 |
$url | 跳转页面地址 |
页面重定向
$this->redirect(‘News/category’);
空控制器空操作
数据库
采用PDO方式,目前包含了Mysql、SqlServer、PgSQL、Sqlite等数据库的支持。
数据库配置
通过配置文件
application\database.php
文件
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'phpdb',
// 用户名
'username' => 'root',
// 密码
'password' => '123456',
// 端口
'hostport' => '3306',
其余方法查阅文档
构造器
增删改查方法
文档查阅
友好的变量输出dump方法
/**
* 浏览器友好的变量输出
* @param mixed $var 变量
* @param boolean $echo 是否输出 默认为true 如果为false 则返回输出字符串
* @param string $label 标签 默认为空
* @return void|string
*/
function dump($var, $echo = true, $label = null)
{
return Debug::dump($var, $echo, $label);
}