2.1 上手Thinkphp6
2.1.1 介绍
ThinkPHP 是一款由国人开发的,免费,开源,轻量级的 PHP 开发框架。中文开发文档齐全,社区活跃, 遇到问题也可以较快获取解决方案。
Thinkphp6 支持 PHP 的强类型, PSR 开发规范得了更广泛的应用。对 Swoole 支持得到了优化与提升,支持更多的 IDE 编辑器友好提示,对原生的语法进行大量的精简。
环境要求:
PHP>=7.1.0
注意: 6.0 版本之后,必须通过 Composer 方式安装和更新,无法通过 Git 下载安装。
2.1.2 安装
windows 下安装 composer :
下载并且运行 Composer-Setup.exe,它将安装最新版本的 Composer ,并设置好系统的环境变量,因此你可以在任何目录下直接使用 composer 命令。
建议使用国内镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
ThinkPHP6 稳定版安装:
composer create-project topthink/think tp
这里的 tp
项目名称可以自行更改,这个目录就是我们后面会经常提到的应用根目录。
ThinkPHP6 开发版安装:
composer create-project topthink/think=6.0.x-dev tp
安装完成之后就可以通过域名访问新建的 ThinkPHP6 框架, 如果看到欢迎页面。恭喜你,已经完成 ThinkPHP6.0
的安装 。
2.1.3 目录介绍
www WEB部署目录(或者子目录)
├─app 应用目录
│ ├─controller 控制器目录
│ ├─model 模型目录
│ ├─ ... 更多类库目录
│ │
│ ├─common.php 公共函数文件
│ └─event.php 事件定义文件
│
├─config配置目录
│ ├─app.php 应用配置
│ └─...更多配置
│
├─view 视图目录
├─route 路由定义目录
│ ├─route.php 路由定义文件
│ └─ ...
│
├─publicWEB目录(对外访问目录)
│ ├─index.php 入口文件
│ └─router.php 快速测试文件
│
├─runtime 应用的运行时目录(可写,可定制)
├─composer.json composer 定义文件
└─think 命令行入口文件
核心目录与文件 :
App 目录
你的大部分应用程序都位于 app
目录中。默认情况下,此目录的命名空间为 App
,控制器、模型、路由、验证器等内容都可以放在 app 目录。
Config 目录
config 目录,顾名思义,包含应用程序所有的配置文件。我们鼓励你通读这些文件,以便帮助你熟悉所有可用的选项。
View目录
根目录下面的 view 为全局的视图目录,如果 app 应用下面没 view 目录, 默认的视图就会在这个目录查找。
Route 目录
根目录下面 route 目录未全局的路由目录,如果为多应用,推荐在对应应用下面创建 route 目录。
Public 目录
public
目录包含了入口文件 index.php
,它是进入应用程序的所有请求的入口点。此目录还包含了一些你的资源文件(如图片、JavaScript 和 CSS )。
Runtime 目录
应用的运行时目录,日志以及上传的文件默认保存目录。
2.2 Thinkphp6 请求与响应
2.2.1 控制器
控制器是指按照预定顺序改变程序,它是发布命令的 “ 决策机构 ”,即完成协调和指挥整个程序的操作。
访问控制器
域名/项目名/public/index.php/index/index
注意: 如果有域名,推荐根目录为 public , 那么访问地址对应为: 域名 /index.php/index/index , 伪静态处理参考tp6官方手册。
定义控制器 :
控制器文件通常放在 controller 下面,类名和文件名保持一致,并采用驼峰命名(首字母大写)。
<?php
namespace app\controller;
class Login
{
public function login()
{
return 'Hello World!';
}
}
资源控制器(命令创建控制器):
#资源控制器 自带一些常用的方法
php think make:controller News
#或者 plain为创建一个简单版的控制器(只有命名空间跟类名)
php think make:controller News --plain
渲染输出 :
public function outPut()
{
#htm格式输出
#return 'Hello World!';
#json格式
$data = ["hello"=>"world"];
return json($data);
}
#dump,halt调试变量输出
dump('hello');
halt('halt是tp框架封装的断点调试,后面代码不在执行')
}
依赖注入 :
public function index(\think\Request $request)
{
return $request->param('name');
}
静态调用 :
public function index()
{
return \think\facade\Request::param('name');
}
请求信息 :
可以通过请求对象获取当前请求的 控制器/操作名: 如查看当前请求的控制器的方法是 Request::controller( )
方法 | 含义 |
---|---|
controller | 当前请求的控制器名 |
action | 当前请求的操作名 |
method | 获取当前请求方式 |
更多方法可以打开\think\Request类查看里面封装的方法或者参考 Thinkphp 手册
控制器重定向 :
- 完整地址重定向 :
return redirect('https://space.bilibili.com/546137543');
- 站内跳转使用完整地址重定向 :
语法结构 :
return redirect (‘/ 应用名 / 控制器名 / 方法名 [/ 参数 / 值 ]’ );
控制器使用 :
核心控制器:框架核心 tink/Controller
6.0 取消了框架的核心控制器,提供了app\BaseController
,BaseController 是一个抽象类。
在Index控制器中, 可以看到 Index 控制器默认继承基础控制器 BaseController 。
<?php
namespace app\controller;
use app\BaseController;
class Index extends BaseController
{
public function index()
{
return 'index控制器 - index方法';
}
}
访问 Index 控制器 中的 index 方法 :
Index 继承于 BaseController , 可以在index方法中 使用父类的 request 对象调用 param,get,post等方法获取请求参数 :
public function index()
{
dump($this->request->param());
// dump($this->request->get());
}
访问index方法时加入参数id与name:/index/index?id=113428497&name=nahida
输出:
array:2[
"id" => 113428497,
"name" => “nahida”
]
其他获取请求参数的方法 :
<?php
namespace app\controller;
use app\BaseController;
use app\Request;
class Index extends BaseController
{
public function index(Request $request)
{
//通过依赖注入拿到 $request对象 调用param方法获取参数
$request->param('id');
//通过门面模式 或者 在上面引入: use think\facade\Request;
\think\facade\Request::param('id');
//通过input 方法
input('id');
//通过 request 方法
request()->param('id');
}
}
注意: $this->request->param(‘name’,1,‘intval’); param 方法第一个参数 是获取的参数名,第二个参数是默认值,如果没有name参数,默认就是1,intval 是参数转换。以上各种获取请求参数的方法 都可以这么用。
变量类型方法包括:
方法 | 描述 |
---|---|
param | 获取当前请求的变量 |
get | 获取 $_GET 变量 |
post | 获取 $_POST 变量 |
put | 获取 PUT 变量 |
delete | 获取 DELETE 变量 |
session | 获取 SESSION 变量 |
cookie | 获取 $_COOKIE 变量 |
request | 获取 $_REQUEST 变量 |
server | 获取 $_SERVER 变量 |
env | 获取 $_ENV 变量 |
route | 获取 路由(包括PATHINFO) 变量 |
middleware | 获取 中间件赋值/传递的变量 |
file | 获取 $_FILES 变量 |
all V6.0.8+ | 获取包括 $_FILES 变量在内的请求变量,相当于param+file |
2.2.2 路由
要使用 Route
类注册路由必须首先在路由定义文件开头添加引用(项目根目录下面 route 目录,该目录下面可以任意创建 php 文件为路由文件)
# 项目根目录下面
use think\facade\Route;
# 注册路由到News控制器的read操作(单应用)
Route::rule('new/:id','News/read');
访问 : http://serverName/new/5
#Route::快捷方法名('路由表达式', '路由地址');
#动态变量 :变量 或者 <变量>
Route::get('new/<id>','News/read'); // 定义GET请求路由规则
Route::post('new/<id>','News/update'); // 定义POST请求路由规则
Route::put('new/:id','News/update'); // 定义PUT请求路由规则
Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则
Route::any('new/:id','News/read'); // 所有请求都支持的路由规则
注册多个路由规则后,系统会依次遍历注册过的满足请求类型的路由规则,一旦匹配到正确的路由规则后则开始执行最终的调度方法,后续规则就不再检测。
2.2.3 视图
视图功能由 \think\View
类配合视图驱动(也即模板引擎驱动)类一起完成,新版仅内置了 PHP 原生模板引擎(主要用于内置的异常页面输出),如果需要使用其它的模板引擎需要单独安装相应的模板引擎扩展。
composer require topthink/think-view
模板赋值 :
namespace app\controller;
use think\facade\View;
class Login
{
public function test()
{
View::assign('name','nahida');
View::assign(['age'=>5,'addr'=>'湖南长沙']);
View::fetch(); #等同于View::fetch('test')或者View::fetch('login/test'),fetch方法在没有参数的时候默认在当前应用的view目录查找当前控制器/当前方法名的视图模板即login/test.html
}
}
在模板中使用 :
在模板中输出变量的方法很简单,只需要使用标签开始标记和结束标记包含, 默认的开始和结束标记为 { },如:
{$name}
模板编译后的结果如下 :
<?php
echo htmlentities($name);
?>
这样,运行的时候就会在模板中显示:nahida
2.3 Thinkphp6 数据库操作
数据库配置 :
return [
'default' => 'mysql',
'connections' => [
'mysql' => [
// 数据库类型
'type'=> 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'nahida',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => 'root',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'tp_',
],
'demo' => [
// 数据库类型
'type'=> 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'demo',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => 'root',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
],
],
];
默认使用 connections 里面的 mysql 对应的数据库,可以通过在模型里面指定 $connection 连接不同库,例如使用配置中demo对应的库,只需要在模型类中申明 :
protected $connection = 'demo';
查询 ( find,select,value,columns ) :
// table方法必须指定完整的数据表名
Db::table('think_user')->where('id', 1)->find();
最终生成的SQL语句可能是 :
SELECT * FROM `think_user` WHERE `id` = 1 LIMIT 1
$list = Db::table('think_user')->where('status', 1)->select();
# 返回某个字段的值
Db::table('think_user')->where('id', 1)->value('name');
# 返回数组
Db::table('think_user')->where('status',1)->column('name');
# 指定id字段的值作为索引
Db::table('think_user')->where('status',1)->column('name', 'id');
新增数据 ( save,insert,insertall ):
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->save($data);
Db::name('user')->insert($data);
#批量新增
$data = [
['foo' => 'bar', 'bar' => 'foo'],
['foo' => 'bar1', 'bar' => 'foo1'],
['foo' => 'bar2', 'bar' => 'foo2']
];
Db::name('user')->insertAll($data);
修改数据 ( save,update ) :
Db::name('user')
->save(['id' => 1, 'name' => 'thinkphp']);
#save方法会自动判断是新增数据还是更新数据,主要是判断数据中是否包含主键数据。
Db::name('user')
->update(['id' => 1, 'name' => 'thinkphp']);
# 如果要更新的字段是数值类型,可以使用inc/dec方法自增或自减一个字段的值
# 比如score 字段加 1 inc第二个参数为自增步长
Db::name('user')
->where('id', 1)
->inc('score')
->update();
删除数据 ( delete ) :
# 根据主键删除
Db::table('think_user')->delete(1);
Db::table('think_user')->delete([1, 2, 3]);
# 条件删除
Db::table('think_user')->where('id', 1)->delete();
Db::table('think_user')->where('id', '<', 10)->delete();
2.4 thinkphp6 中间件与事件
2.4.1 中间件
可以通过命令行指令快速生成中间件
php think make:middleware Check
这个指令会 app/middleware
目录下面生成一个 Check
中间件。
<?php
namespace app\middleware;
class Check
{
public function handle($request, \Closure $next)
{
if ($request->param('name') == 'nahida') {
return redirect('/index/nahida');
}
#在这个中间件中我们判断当前请求的name参数等于nahida的时候进行重定向处理。否则,请求将进一步传递到应用中。要让请求继续传递到应用程序中,只需使用 $request 作为参数去调用回调函数 $next 。
return $next($request);
}
}
注意:中间件方法必须返回 Response 对象实例。
中间件主要用于拦截或过滤应用的 HTTP
请求,并进行必要的业务处理。
2.4.2 事件
tp6 的事件系统可以看作是 把 5.1 版本行为和钩子以及模型事件、数据库事件等的整合到一起的升级版。事件系统使用了观察者模式,提供了较好的应用解耦方式。
比如,我们要实现登录成功后记录一条日志的功能,就可以用事件来实现。原理是登录成功后触发日志写入的事件。
控制器中登录方法 :
...
public function login()
{
// 假如登录成功
// TODO 调用写入日志的方法
}
...
创建事件监听类 :
// 创建到 common 公共目录下,方便其模块使用。
php think make:listener common@UserLogin
UserLogin.php
<?php
declare (strict_types = 1);
namespace app\common\listener;
class UserlUserLoginogin
{
/**
* 事件监听处理
*
* @return mixed
*/
public function handle($event)
{
//
}
}
事件定义文件中定义对应事件的监听。
event.php
<?php
// 事件定义文件
return [
'bind' => [
],
'listen' => [
'AppInit' => [],
'HttpRun' => [],
'HttpEnd' => [],
'LogLevel' => [],
'LogWrite' => [],
'UserLogin' => ['app\common\listener\UserLogin'],
],
'subscribe' => [
],
];
UserLogin.php
...
public function handle($event)
{
echo '这里是日志写入逻辑';
var_dump($event);
}
...
在控制器可以触发事件 :
...
use think\facade\Event;
...
public function login()
{
// 假如登录成功
$userInfo = [
'id' => 1,
'name' => 'admin'
];
Event::trigger('UserLogin',$userInfo);
}
...
运行查看 :
事件相比较中间件的优势是事件比中间件更加精准定位(或者说粒度更细),并且更适合一些业务场景的扩展。
2.5 think 命令
项目根目录 cmd 命令行执行 php think , 会出现下面提示信息
>php think
version 6.0.7
Usage:
command [options] [arguments]
Options:
-h, --help Display this help message
-V, --version Display this console version
-q, --quiet Do not output any message
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3
for debug
Available commands:
build Build App Dirs
clear Clear runtime file
help Displays help for a command
list Lists commands
run PHP Built-in Server for ThinkPHP
version show thinkphp framework version
make
make:command Create a new command class
make:controller Create a new resource controller class
make:eventCreate a new event class
make:listener Create a new listener class
make:middleware Create a new middleware class
make:modelCreate a new model class
make:service Create a new Service class
make:subscribe Create a new subscribe class
make:validate Create a validate class
optimize
optimize:route Build app route cache.
optimize:schema Build database schema cache.
route
route:listshow route list.
service
service:discover Discover Services for ThinkPHP
vendor
vendor:publish Publish any publishable assets from vendor packages
系统自带的常用命令,包括 :
指令 | 描述 |
---|---|
build | 自动生成应用目录和文件 |
help | 帮助 |
list | 指令列表 |
clear | 清除缓存指令 |
run | 启动PHP内置服务器 |
version | 查看当前框架版本号 |
make:controller | 创建控制器类 |
make:model | 创建模型类 |
make:command | 创建指令类文件 |
make:validate | 创建验证器类 |
make:middleware | 创建中间件类 |
make:event | 创建事件类 |
make:listener | 创建事件监听器类 |
make:subscribe | 创建事件订阅者类 |
make:service | 创建系统服务类 |
optimize:autoload | 生成类库映射文件 |
optimize:config | 生成配置缓存文件 |
optimize:schema | 生成数据表字段缓存文件 |
optimize:facade | 生成Facade注释 |
route:build | 生成注解路由 |
route:list | 查看路由定义 |
service:discover | 自动注册扩展包的系统服务 |
vendor:publish | 自动生成扩展的配置文件 |
注意:更多的指令可以自己扩展。