ThinkPHP6 入门

框架简介

  1. ThinkPHP6.0 是目前框架正式版的最新版本,发布于 2019 年 10 月 24 日;
  2. TP 框架是免费开源的、轻量级的、简单快速且敏捷的 PHP 框架;
  3. 你可以免费使用 TP 框架,甚至可以将你的项目商用;
  4. ThinkPHP6.0 要求 PHP 版本是 7.1+以上,官方推荐 7.3;
  5. 那我该学习哪个版本?如果你的生产环境是 5.6 ~ 7.0 之间,推荐 TP5.1;
  6. 如果你是自己的 vps 服务器,可以安装较高的 PHP 版本 7.1+,推荐 TP6.x;
  7. 集成环境这里采用 windows 结合 wamp,其它系统或环境满足版本要求即可;
  8. 除了 PHP7.1+,还需要开启 PDO 数据库引擎和 MBstring 字符串扩展;
  9. 我在以往的 wamp 版本上添加了一个目前最新的 PHP7.3.11;(PHP7.4 是 RC)

安装步骤

  1. 官网不提供软件包下载,采用 Composer 下载和更新;
  2. 这里只演示 windows 安装,Mac 和 Linux 方法参考一下手册;
  3. 在 Windows 中,你需要下载并运行 Composer-Setup.exe;
  4. 打开 windows 下的运行:cmd,然后运行如下代码(或 Mac 和 Linux 控制台):
composer config -g repo.packagist composer https://packagist.phpcomposer.com 
  1. 如果上述地址产生阻碍,可以使用国内的:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
  1. 现在,先启用服务器环境,测试本地 Web 环境是否正常;
  2. 如果你是首次安装 ThinkPHP6.0,那么先从 cmd 中切换到你要加载的目录;
composer create-project topthink/think tp6
  1. 如果要更新你的项目版本,直接进入项目根目录,然后直接如下代码:
composer update topthink/framework

测试运行

  1. 在 cmd 命令行的项目目录中,输入运行命令;
php think run
  1. 在浏览器输入:http://127.0.0.1:8000http://localhost:8000

  2. 如果 80 端口没有被占用的情况下,使用如下命令直接访问 http://localhost;

    php think run -p 80
  3. 也可以通过修改nginx或apache的配置文件将web解析到框架的public目录

开发规范和目录结构

开发规范

  1. ThinkPHP6.0 遵循的是 PSR-2 的命名规范和 PSR-4 的自动加载;
  2. 目录和文件的规范如下:

a. 目录名(小写+下划线); b. 类库和函数文件统一以.php为后缀; c. 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致; d. 类(包含接口和 Trait)文件采用驼峰式命名(首字母大写),其它采用小写+下划线命名; e. 类名(包括接口和 Trait)和文件名保持一致,统一采用驼峰式命名(首字母大写);

  1. 函数和类、属性命名规范如下:

a. 类的命名采用驼峰法(首字母大写),如:User,UserType; b. 函数的命名使用小写字母和下划线(小写字母开头)的方式,如:get_client_ip; c. 方法的命名使用驼峰法(首字母小写),如:getUserName; d. 属性的命名使用驼峰法(首字母小写),如:tableName; e. 特例:以双下划线__打头的函数或方法作为魔术方法,如:__call__autoload;

  1. 常量与配置的规范如下:

a. 常量以大写字母和下划线命名,如:APP_PATH; b. 配置参数以小写字母和下划线命名,如:url_convert; c. 环境变量定义使用大写字母和下划线命名,如:APP_DEBUG;

  1. 数据表和字段的规范如下:

a. 数据表和字段采用小写加下划线方式命名; b. 并注意字段名不要以下划线开头,如: think_user表和user_name c. 字段不建议使用驼峰和中文作为数据表及字段命名;

目录结构

  1. ThinkPHP6.0 支持多应用模式部署,app是应用目录;
  2. 默认情况下,是采用的单模式,如下图结构:

QQ截图20200721135950.png

  1. 多应用模式下,结构如下图:

QQ截图20200721140000.png

  1. 上图中,app_name可以有多个,即多应用模式;
  2. 在目录结构上,只确保对外可访问的仅public目录;

QQ截图20200721140139.png

  1. 在 app 目录中,还提供了一些文件,这些文件将在后面逐步讲到;

QQ截图20200721140223.png

开启调试与配置文件

开启调试

  1. 在开发阶段,我们建议开启框架的调试模式;
  2. 调试模式开启后,会牺牲一些执行效率,但大大提高了开发排错的能力;
  3. 当项目部署到生产环境时,再关闭调试模式即可;
  4. 安装好的 TP6.0 默认并没有开启调试,可以在域名后面胡乱输入字符回车;
  5. 此时,页面只会提示:页面错误,请稍后再试~,表示调试未开启;
  6. 通过命令行安装的 TP6.0,会自动在根目录生成一个.example.env文件;
  7. 这个.env文件是环境配置文件,我们只要删除前面的.example即可生效;
  8. 此时,刷新页面,右下角会出现 Trace 调试小图标,说明调试开启了;
  9. 查看.env文件,打开调试的环境变量为APP_DEBUG = true,false关闭;

QQ截图20200721142333.png

  1. 那么,开启调试模式有那些显著的优势呢?

a. 记录系统运行流程的执行过程; b. 展示错误和调试信息,并开启日志记录; c. 模版修改可以及时生效(不会被缓存干扰); d. 启动右下角的 Trace 调试功能,更加强大; e. 发生异常时,也会显示异常信息;

  1. 当然,还有一种模式,就是关闭调试的时候,也可以显示简要的错误信息;
  2. 首先,关闭调试模式:APP_DEBUG = false;
  3. 然后,根目录下configapp.php最后一样设置为:
'show_error_msg' => true, 

配置信息

  1. 配置文件有两种形式,开启调试我们采用的.env文件这是一种,适合本地;
  2. 另一种配置文件,在根目录下的config里,有很多类型的配置,适合部署;
  3. 官方手册明确表示:.env环境变量用于本地开发测试,部署后会被忽略;
  4. 那么,我们怎么去获取这些配置文件的值呢?
  5. 对于.env文件,比如[DATABASE]下的HOSTNAME = 127.0.0.1获取方式如下:

QQ截图20200721142845.png

  1. 对于 config 文件,比如 database.php 下的 hostname,获取方式如下:

QQ截图20200721143742.png

  1. 也可以判断这两种文件的配置是否存在,使用 has 方法判断:

QQ截图20200721144119.png

  1. 关于这两种配置文件的优先级,在本地测试时.env优先于 config;
  2. config配置中可以看出,它是先读取.env的,然后再默认配置一个自己的;
  3. 而到了部署环境,.env会被忽略,则自动切换到config配置;

URL 访问模式

URL 解析

  1. ThinkPHP 框架非常多的操作都是通过 URL 来实现的;
  2. 多应用:http://serverName/index.php/应用/控制器/操作/参数/值…;
  3. 单应用:http://serverName/index.php/控制器/操作/参数/值…;
  4. 由于 TP6.0 默认是单应用模式,多应用需要作为扩展安装,避免混乱暂时搁置;
  5. http://serverName是域名地址,比如127.0.0.1:8000localhost/tp6/
  6. index.php这个文件,是根目录下public/下的index.php(入口文件);
  7. 控制器:app目录下有一个controller控制器目录的Test.php(控制器);
  8. Test.php控制器的类名也必须是class Test,否则错误;
  9. 操作就是控制器类里面的方法,比如:index(默认免写)或hello(必写);
  10. 那么完整形式为:
  • http://127.0.0.1/test/hello/name/world
  • http://127.0.0.1/index.php/test/hello/name/world
<?php
namespace app\controller;

use app\BaseController;

class Test extends BaseController
{
    public function index()
    {
        return 'hello';
    }

    // 链接中的/test/hello/name/world分别为
    // /类名/方法名/形参名/值
    public function hello($name = 'ThinkPHP6')
    {
        return 'hello,' . $name;
    }
}

URL 兼容模式

  1. 上个要点已经了解了 URL 所有访问规则,通过创建 Test 控制器更加了解;
  2. 如果上面那种形式的 URL 不支持的话,可以使用兼容模式的方式来访问:
  • http://localhost?s=test/hello/name/world

控制器

控制器定义

  1. 控制器,即controller,控制器文件存放在app/controller目录下;
  2. 如果想改变系统默认的控制器文件目录,可以在configroute.php配置:

QQ截图20200721151038.png

'controller_layer' => 'controller123',
  1. 类名和文件名大小写保持一致,并采用驼峰式(首字母大写);

QQ截图20200721151240.png

  1. 从上面两段代码得知Test.php的实际位置为:app\controller\Test.php
  2. Test类创建两个方法index(默认)和hello,访问 URL 如下:
  • http://localhost/test/
  • http://localhost/test/hello
  1. 那么如果创建的是双字母组合,比如class HelloWorld,访问 URL 如下:
  • http://localhost/helloworld
  • http://localhost/hello_world
  1. 如果你想避免引入同类名时的冲突,可以route.php设置控制器后缀:
'controller_suffix' => true,
  1. 此时,Test.php就必须改成TestController.php,并类名也需要增加后缀;

渲染输出

  1. ThinkPHP 直接采用方法内return返回的方式直接就输出了;
  2. 使用json输出,直接采用json函数;
$data = array('a'=>1, 'b'=>2, 'c'=>3);
return json($data);
  1. 不推荐使用die,exit等PHP方法中断代码执行,推荐助手函数halt();
halt('中断测试');

QQ截图20200721151729.png

基础.空.多级控制器

基础控制器

  1. 一般来说,创建控制器后,推荐继承基础控制器来获得更多的方法;
  2. 基础控制器仅仅提供了控制器验证功能,并注入了think\Appthink\Request;
  3. 这两个对象后面会有章节详细讲解,下面我们继承并简单使用一下;
<?php
namespace app\controller;

use app\BaseController;

class Test extends BaseController
{
    public function index()
    {
        //返回实际路径
        echo $this->app->getBasePath();
        //返回当前方法名
        echo $this->request->action();
    }
}

空控制器

  1. 在单应用模式下,我们可以给项目定义一个Error控制器类,来提醒错误;
<?php
namespace app\controller;

class Error
{
    public function index()
    {
        return '当前控制器不存在!';
    }
}

多级控制器

  1. 所谓多级控制器,就是在控制器controller目录下再建立目录并创建控制器;
  2. 我们在controller目录下建立group目录,并创建Blog.php控制器;
  3. 而此时,我们需要访问的地址为:http://localhost/group.blog
<?php
namespace app\controller\group;

use app\BaseController;

class Blog extends BaseController
{
    public function index()
    {
        return 'index';
    }
}