ThinkPHP大纲

1. 简介

1.1 什么是ThinkPHP

  • 什么是ThinkPHP

ThinkPHP是一个开源的PHP开发框架,它遵循MVC(模型-视图-控制器)的设计模式,具有高效、灵活、安全、简单等特点。ThinkPHP提供了丰富的功能和工具,包括数据库操作、缓存、验证、模板引擎等,可以帮助开发者快速构建高质量的Web应用程序。同时,ThinkPHP还拥有完善的文档和社区支持,是PHP开发者的优秀选择。

1.2 ThinkPHP的历史

  • ThinkPHP的历史:ThinkPHP是一款开源的PHP开发框架,由中国开发者创造和维护。它的第一个版本于2006年发布,经过多年的发展和迭代,已经成为国内最流行的PHP框架之一。ThinkPHP采用了MVC设计模式,具有高效、简洁、安全、可扩展等特点,广泛应用于各种Web应用程序的开发。

1.3 ThinkPHP的优势- 简单高效的路由功能

  • 强大的模板引擎
  • 丰富的数据库支持
  • 安全性高的认证和授权机制
  • 丰富的第三方类库支持
  • 灵活的插件机制
  • 完善的错误处理和调试机制
  • 详细的开发文档和社区支持

2. 安装和配置

2.1 环境要求

  • 环境要求:
    • PHP >= 5.6.0
    • PDO PHP Extension
    • MBstring PHP Extension
    • CURL PHP Extension
    • OpenSSL PHP Extension

2.2 安装ThinkPHP

  • 安装ThinkPHP
    • 方法一:使用Composer安装

composer create-project topthink/think tp5

    • 方法二:手动安装
      1. 下载最新版本的ThinkPHP框架
      2. 解压到项目目录中
      3. 配置虚拟主机或者使用PHP内置服务器启动
    • 方法三:使用Git安装

git clone https://github.com/top-think/think.git

2.3 配置ThinkPHP- 配置数据库连接信息、URL模式、默认访问块

'DB_TYPE'   => 'mysql', // 数据库类型
'DB_HOST'   => 'localhost', // 服务器地址
'DB_NAME'   => 'test', // 数据库名
'DB_USER'   => 'root', // 用户名
'DB_PWD'    => '', // 密码
'DB_PORT'   => '3306', // 端口
'DB_PREFIX' => 'think_', // 数据库表前缀

'URL_MODEL' => 2, // URL模式

'DEFAULT_MODULE' => 'Home', // 默认模块

3. MVC模式

3.1 什么是MVC模式

  • MVC模式是一种软件架构模式,将一个应用程序分为三个核心部分:模型(Model),视图(View)和控制器(Controller)。
  • 模型(Model):负责处理应用程序的数据逻辑,包括数据的存储、检索、更新和删除等操作。
  • 视图(View):负责展示数据给用户,通常是通过HTML、CSS和JavaScript等技术生成页面。
  • 控制器(Controller):负责处理用户的请求并调用相应的模型和视图,将它们组合成一个完整的响应返回给用户。
  • MVC模式可以使应用程序的各个部分分离开来,便于开发、测试和维护。

3.2 ThinkPHP中的MVC模式

  • 在ThinkPHP中,MVC模式分为三个部分:模型、视图、控制器。
  • 模型(Model):负责数据的处理,包括数据的增删改查等操作。
  • 视图(View):负责数据的展示,将处理好的数据以页面的形式呈现给用户。
  • 控制器(Controller):负责接收用户的请求,调用相应的模型和视图,最终将处理好的数据返回给用户。
  • 通过MVC模式的分离,可以使得代码更加清晰、易于维护。同时,也可以使得不同的开发人员在不同的模块中进行开发,提高开发效率。
  • 在ThinkPHP中,使用MVC模式开发的步骤如下:
    1. 定义模型:在/application目录下创建model目录,然后在该目录下创建对应的模型文件。
    2. 定义视图:在/application目录下创建view目录,然后在该目录下创建对应的视图文件。
    3. 定义控制器:在/application目录下创建controller目录,然后在该目录下创建对应的控制器文件。
    4. 在控制器中调用模型和视图,处理用户的请求。

3.3 MVC模式的优势- 降低耦合度:MVC模式将应用程序分为三个部分,使它们可以独立开发、测试、维护和修改,从而降低了它们之间的耦合度。

  • 提高复用性:MVC模式使得模型和视图可以在不同的应用程序中重复使用,从而提高了代码的复用性。
  • 易于维护:MVC模式将应用程序分为三个部分,使得每个部分都可以独立地进行修改和维护,从而使得整个应用程序更易于维护。
  • 更好的可扩展性:MVC模式使得应用程序可以更容易地进行扩展,例如添加新的视图或控制器,而不会影响到其他部分的代码。
  • 更好的测试性:MVC模式使得应用程序的每个部分都可以独立地进行测试,从而提高了测试的效率和可靠性。

4. 路由

4.1 什么是路由

  • 路由是指将URL请求映射到特定的处理程序的过程。
  • 在ThinkPHP中,路由配置文件位于项目根目录下的route目录中的route.php文件中。
  • 路由配置可以通过闭包函数、控制器方法、静态方法等多种方式来定义。
  • 例如,我们可以在route.php文件中定义以下路由规则:
use think\facade\Route;

//闭包函数路由
Route::get('hello/:name', function ($name) {
    return 'Hello,' . $name . '!';
});

//控制器方法路由
Route::get('user/:id', 'index/User/read');

//静态方法路由
Route::get('test', '\app\index\controller\Test::index');
  • 上述代码中,分别定义了三种不同类型的路由规则,分别是闭包函数路由、控制器方法路由和静态方法路由。
  • 闭包函数路由通过匿名函数来处理请求,控制器方法路由通过指定控制器类和方法来处理请求,静态方法路由通过指定静态方法所在的类来处理请求。
  • 通过路由配置,我们可以将URL请求映射到特定的处理程序,实现更加灵活和方便的URL管理。

4.2 ThinkPHP中的路由

  • ThinkPHP中的路由
    • 基本路由 Route::rule('hello/:name', 'index/hello');
    • 路由参数Route::rule('blog/:id', 'blog/read');
    • 路由分组
Route::group('admin', function () {
  Route::rule('user', 'admin/user/index');     
  Route::rule('login', 'admin/login/index'); 
}); 
    • 路由别名Route::rule('user/:id', 'index/user/read')->alias('user');
    • 路由重定向Route::rule('home', 'index/index/index', 'redirect');
    • 路由缓存'url_route_cache' => true,

4.3 路由的优势- 可以隐藏URL中的参数,增加了URL的美观性和安全性。

  • 可以将URL与具体的控制器和方法进行绑定,方便管理和维护。
  • 可以通过路由规则进行URL的重定向和自定义,提高了灵活性和可扩展性。
  • 可以根据不同的请求方式和参数,匹配不同的路由规则,实现更细粒度的控制和处理。
  • 可以通过路由分组,将不同模块的路由规则进行分离和管理,提高了代码的可读性和可维护性。

5. 控制器

5.1 什么是控制器

  • 什么是控制器:
    控制器是MVC模式中的C,是整个应用程序的控制中心,负责接收用户的请求,调用模型和视图完成用户的需求。控制器可以根据请求的不同,调用不同的模型和视图,实现不同的功能。下面是一个简单的控制器示例:
 
  

这个控制器定义在app\index\controller\Index.php文件中,命名空间为app\index\controller。控制器中有一个index方法,当用户请求访问/index/index时,就会调用这个方法并返回Hello, ThinkPHP!。

5.2 ThinkPHP中的控制器

  • 控制器是MVC架构中的C,主要负责处理用户请求和返回响应结果。
  • ThinkPHP中的控制器命名规范为:模块名+Controller,如IndexController。
  • 控制器中的方法即为用户请求的操作,可以通过URL访问到。
  • 控制器中可以使用$this->assign()方法将变量传递给模板。
  • 控制器中可以使用$this->redirect()方法进行重定向。
  • 控制器中可以使用$this->error()方法和$this->success()方法分别返回错误和成功信息。
  • ThinkPHP中的控制器可以继承Think\Controller类,也可以继承自定义的基类。
  • 控制器中可以使用__construct()方法进行初始化操作。
  • 控制器中可以使用_before()方法和_after()方法进行前置和后置操作。
  • 控制器中可以使用_ajax()方法和_json()方法分别返回Ajax请求和JSON数据。
  • 控制器中可以使用_table()方法和_export()方法分别输出表格和导出数据。

5.3 控制器的优势- 通过控制器可以实现代码的模块化,使得代码更加清晰易懂。

  • 控制器可以对请求进行处理和响应,实现业务逻辑。
  • 控制器可以调用模型层的方法,实现对数据的操作。
  • 控制器可以进行权限控制,保护系统的安全性。
  • 控制器可以实现路由的控制,方便进行 URL 设计和管理。

6. 模型

6.1 什么是模型

  • 模型是MVC架构中的M,即数据模型,用于处理数据的增删改查操作。
  • 模型通常与数据库中的表相对应,一个模型类对应一个表。
  • 模型可以定义数据验证规则、关联关系、操作数据库等。
  • 模型的定义一般放在application\index\model目录下,可以通过继承think\Model类来定义模型。
  • 示例代码:
namespace app\index\model;

use think\Model;

class User extends Model
{
    // 定义数据表名
    protected $table = 'user';

    // 定义主键
    protected $pk = 'id';

    // 定义时间戳字段
    protected $autoWriteTimestamp = true;

    // 定义数据验证规则
    protected $rule = [
        'name|姓名' => 'require|max:20',
        'age|年龄' => 'require|integer|between:1,120',
        'email|邮箱' => 'email|unique:user',
    ];

    // 定义关联关系
    public function orders()
    {
        return $this->hasMany('Order', 'user_id', 'id');
    }

    // 定义操作数据库
    public function getUserById($id)
    {
        return $this->where('id', $id)->find();
    }
}

6.2 ThinkPHP中的模型

  • 模型定义

ThinkPHP中的模型使用MVC设计模式,模型主要负责和数据库打交道,处理数据的增删改查等操作。在ThinkPHP中,一个模型对应着一张数据库表,通过模型可以对这张表进行操作。

  • 模型的使用
  1. 定义模型

定义一个模型需要继承Think\Model类,例如定义一个User模型:

namespace app\index\model;

use think\Model;

class User extends Model
{
    // 模型关联的数据表
    protected $table = 'user';

    // 模型的主键
    protected $pk = 'id';

    // 模型的字段信息
    protected $schema = [
        'id'         => 'int',
        'username'   => 'string',
        'password'   => 'string',
        'create_time'=> 'int',
        'update_time'=> 'int',
    ];
}

2.增加数据

$user = new User;
$user->username = 'admin';
$user->password = md5('123456');
$user->create_time = time();
$user->save();

3.查询数据

// 查询所有数据
$users = User::select();

// 根据主键查询单条数据
$user = User::get(1);

// 查询指定字段的数据
$users = User::field('id,username')->select();

// 查询条件
$users = User::where('username', 'admin')->select();

// 分页查询
$users = User::paginate(10);

4.更新数据

$user = User::get(1);
$user->username = 'admin2';
$user->save();

5.删除数据

$user = User::get(1);
$user->delete();
  • 模型关联

ThinkPHP中的模型支持多种关联方式,包括一对一、一对多、多对多等关联方式。例如定义一个User模型和一个Order模型,一个用户可以对应多个订单,一个订单只能对应一个用户:

namespace app\index\model;

use think\Model;

class User extends Model
{
    // 定义一对多关联
    public function orders()
    {
        return $this->hasMany('Order');
    }
}

class Order extends Model
{
    // 定义一对一关联
    public function user()
    {
        return $this->belongsTo('User');
    }
}

查询用户及其订单信息:

$user = User::with('orders')->find(1);

// 输出用户信息
echo $user->username;

// 输出用户的订单信息
foreach ($user->orders as $order) {
    echo $order->order_no;
}

6.3 模型的优势- 模型可以帮助我们更好地组织和管理数据,使得数据的增删改查变得更加方便快捷。

  • 模型可以对数据进行有效的校验和验证,保证数据的合法性和完整性。
  • 模型可以将业务逻辑和数据操作分离,使得代码更加清晰易懂,易于维护。
  • 模型支持多种关联关系,如一对一、一对多、多对多等,方便进行数据的关联查询和操作。
  • 模型支持软删除和查询作用域等高级功能,可以更好地满足复杂业务需求。

7. 视图

7.1 什么是视图

  • 视图是什么?视图(View)是MVC模式中的V,即视图模型(View Model),是Web应用程序中的用户界面。视图通常是一个HTML文件,包含了展示数据的标记和模板。
  • 视图的作用是什么?视图的主要作用是将数据呈现给用户,将控制器中处理好的数据以某种可读性强的方式展示给用户。
  • 视图的使用方法是什么?视图的使用方法是在控制器中调用视图模板,将处理好的数据传递给视图模板,再由视图模板将数据渲染成HTML页面。在ThinkPHP中,使用$this->assign()方法将数据传递给视图模板。例如:
// 控制器中
public function index()
{
    $data = ['name' => 'Tom', 'age' => 18];
    $this->assign('data', $data);
    return $this->fetch();
}



姓名:{$data.name}

年龄:{$data.age}

7.2 ThinkPHP中的视图

  • ThinkPHP中的视图
    • 使用模板引擎输出视图
//在控制器中使用模板引擎输出视图 
public function index() {
  $this->assign('name', 'ThinkPHP');     
	return $this->fetch(); 
} 
//在模板文件中输出变量 

Hello,{$name}!

    • 视图继承
//父模板 
 
 
       
         
    {% block title %}{% endblock %} 
   
       
    {% block content %}
    {% endblock %} 
   
 
//子模板 
{% extends 'layout.html' %} 
{% block title %}
子模板
{% endblock %} 
{% block content %}     

子模板内容

{% endblock %}
    • 视图中的URL生成
//生成控制器方法的URL 
url('index/index'); 
//生成控制器方法的URL,带参数 
url('index/detail', ['id' => 1]); 
//生成模块/控制器/方法的URL 
url('admin/user/index'); 
//生成外部URL 
url('http://www.thinkphp.cn'); 

7.3 视图的优势- 视图的优势:

  • 视图可以将页面的结构和逻辑分离,使得代码更加清晰易懂。
  • 视图可以重复利用,提高代码的复用率。
  • 视图可以根据需要进行继承和组合,使得页面的设计更加灵活多变。
  • 视图可以通过缓存技术提高页面的访问速度,减少服务器的压力。
  • 视图可以使用模板引擎,使得页面的设计更加简单、快捷。

8. 数据库操作

8.1 数据库的配置

  • 数据库的配置:
    • 配置文件位于/config/database.php
    • 配置数据库连接信息:
'hostname' => 'localhost', 
'database' => 'test', 
'username' => 'root', 
'password' => '123456', 
'hostport' => '', 
'params' => [], 
    • 使用Db类进行数据库操作,例如查询:
$list = Db::name('user')->where('status', 1)->select(); 
    • 更多数据库操作方法请参考ThinkPHP官方文档。

8.2 数据库的连接

  • 数据库的连接方式
    • DSN方式
    • 配置文件方式
  • DSN方式连接数据库的示例:
'db_type'   => 'mysql',
'db_host'   => '127.0.0.1',
'db_name'   => 'test',
'db_user'   => 'root',
'db_pwd'    => '',
'db_port'   => '3306',
'db_charset'=>    'utf8',
'db_params' =>  [
    \PDO::ATTR_CASE => \PDO::CASE_NATURAL
],
'db_debug'  =>  true,
'db_deploy_type'=> 0,
'db_rw_separate'=> false,
'db_master_num'=> 1,
'db_slave_no' => '',
'db_fields_strict'=> true,
'db_bind_param'=>   false,
'db_debug'  =>  true,
  • 配置文件方式连接数据库的示例:
return [
    // 数据库类型
    'type'        => 'mysql',
    // 服务器地址
    'hostname'    => '127.0.0.1',
    // 数据库名
    'database'    => 'test',
    // 数据库用户名
    'username'    => 'root',
    // 数据库密码
    'password'    => '',
    // 数据库连接端口
    'hostport'    => '3306',
    // 数据库连接参数
    'params'      => [],
    // 数据库编码默认采用utf8
    'charset'     => 'utf8',
    // 数据库表前缀
    'prefix'      => 'think_',
    // 数据库调试模式
    'debug'       => true,
    // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
    'deploy'      => 0,
    // 数据库读写是否分离 主从式有效
    'rw_separate' => false,
    // 读写分离后 主服务器数量
    'master_num'  => 1,
    // 指定从服务器序号
    'slave_no'    => '',
    // 是否严格检查字段是否存在
    'fields_strict' => true,
    // 数据集返回类型
    'resultset_type' => 'collection',
    // 自动写入时间戳字段
    'auto_timestamp' => false,
    // 时间字段取出后的默认时间格式
    'datetime_format' => 'Y-m-d H:i:s',
    // 是否需要进行SQL性能分析
    'sql_explain' => false,
];

8.3 数据库的增删改查- 数据库的增加操作

// 使用Query类进行数据插入
Db::table('user')->insert([
    'name' => '张三',
    'age' => 20,
    'email' => '[email protected]'
]);

// 使用模型进行数据插入
$user = new User;
$user->name = '李四';
$user->age = 25;
$user->email = '[email protected]';
$user->save();
  • 数据库的删除操作
// 使用Query类进行数据删除
Db::table('user')->where('id', 1)->delete();

// 使用模型进行数据删除
$user = User::get(2);
$user->delete();
  • 数据库的修改操作
// 使用Query类进行数据修改
Db::table('user')->where('id', 3)->update(['name' => '王五']);

// 使用模型进行数据修改
$user = User::get(4);
$user->name = '赵六';
$user->save();
  • 数据库的查询操作
// 使用Query类进行数据查询
Db::table('user')->where('age', '>', 18)->select();

// 使用模型进行数据查询
User::where('age', '<', 30)->select();

表格语法:

操作方式

使用方法

数据库的增加操作

详见上方示例

数据库的删除操作

详见上方示例

数据库的修改操作

详见上方示例

数据库的查询操作

详见上方示例

9. 总结

9.1 ThinkPHP的优势和不足

  • 9.1 ThinkPHP的优势和不足

优势

不足

1. 框架完善的文档和社区支持

1. 学习曲线相对较陡峭

2. 丰富的扩展和插件

2. 部分功能需要额外安装扩展

3. MVC架构清晰易懂

3. 性能相对其他框架略低

4. 数据库操作方便快捷

4. 部分功能需要手动实现

5. 安全性高,自带防止SQL注入等功能

5. 部分功能需要手动实现

9.2 ThinkPHP的应用场景

  • 使用ThinkPHP开发的B2B电商平台案例
  • 使用ThinkPHP开发的企业级OA系统案例
  • 使用ThinkPHP开发的在线教育平台案例
  • 使用ThinkPHP开发的社交网站案例
  • 使用ThinkPHP开发的物流管理系统案例

表格:

应用场景

案例

B2B电商平台

某某电商

企业级OA系统

某某OA

在线教育平台

某某教育

社交网站

某某社交

物流管理系统

某某物流

9.3 ThinkPHP的发展趋势- ThinkPHP的发展趋势:

  • 更加注重性能优化,例如采用Swoole扩展等
  • 更加注重安全性,例如加强对SQL注入、XSS攻击等的防范
  • 更加注重开发效率,例如引入更多的快捷开发工具和插件
  • 更加注重微服务和分布式架构的支持,例如引入RPC、消息队列等技术
  • 更加注重跨平台和跨语言的支持,例如支持多种数据库和多种编程语言的集成。

你可能感兴趣的:(后端,php,开发语言,后端,ThinkPHP)