第2章 应用Thinkphp6框架

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 手册

控制器重定向 :

  1. 完整地址重定向 :
return redirect('https://space.bilibili.com/546137543');
  1. 站内跳转使用完整地址重定向 :

语法结构 :

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自动生成扩展的配置文件

注意:更多的指令可以自己扩展。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纳西妲爱编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值