ThinkPHP 5实战(txt+pdf+epub+mobi电子书下载)


发布时间:2021-08-03 09:22:18

点击下载

作者:夏磊

出版社:清华大学出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

ThinkPHP 5实战

ThinkPHP 5实战试读:

内容简介

本书针对ThinkPHP 5进行编写,内容由浅入深,由局部到整体,以实用性为目标,系统地介绍ThinkPHP框架的相关技术及其在Web开发中的应用。

本书分为18章,内容包括开发环境搭建、配置系统、路由、控制器、数据库操作层、模型层、视图、验证器、缓存、Session和Cookie、命令行应用、开发调试、服务器部署、数据库设计、多人博客系统开发、图书管理系统开发、论坛系统开发与微信小程序商城系统开发。如果读者在阅读本书时遇到问题,还可以到Github上提出问题获得解答。

本书适合ThinkPHP初学者、PHP应用开发人员,也适合作为高等院校和培训学校计算机相关专业的师生教学参考。夏 磊,毕业于湖南工业大学网络工程专业;目前从事软件开发工作,精通PHP服务器脚本语言技术,善于把握与运用新技术,如LAMP平台下Web软件的开发、软件架构、设计模式、JavaScript、YII、Golang等;博客上有大量的Web相关技术文章,深受读者好评;著有图书《ThinkPHP实战》。前 言

PHP是一种通用开源脚本语言,开源、跨平台、易于使用,主要适用于Web开发领域。MVC模式使得PHP在大型Web项目开发中耦合性低、重用性高、可维护性高、有利于软件工程化管理。作为国内MVC框架中的佼佼者,ThinkPHP是一个免费开源、快速、简单的、面向对象的、轻量级PHP开发框架,已经成长为国内最领先和最具影响力的Web应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级网站的开发。

ThinkPHP 5版本是一个颠覆和重构版本,采用全新的架构思想,引入了更多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持composer,并针对API开发做了大量的优化,包括路由、日志、异常、模型、数据库、模板引擎和验证等模块都已经重构,不适合原有ThinkPHP 3.2项目的升级,所以编写了本书。

本书编写的目的是让读者能够系统地学习ThinkPHP 5框架。即使读者不了解MVC模式或者MVC框架,阅读本书也不会有太大的问题,并且学完本书后能基于ThinkPHP 5开发自己的项目。为了加强读者对内容的理解,每一章都有配套示例以及详尽的注释,便于读者理解和学习。大部分章节都会配有练习,进行针对性的训练。在本书的后半部分更是直接展示一个完整项目的开发流程,让读者可以在实践中学习。毕竟“眼过千遍,不如手写一遍”。本书示例代码

针对上一版代码Github单个仓库托管问题,本书实例代码已经改为组织托管,每个项目都会使用独立的仓库保存。所有的实例都可以在Web开发中直接使用,省去了读者“造轮子”的过程,以专注于业务逻辑开发。对于本书内容有任何疑问或者在实际开发中遇到问题的读者可以在Github上的issue中提出问题,作者会进行解答。本书仓库地址为https://github.com/thinkphp5-inaction。如果下载有问题,请联系booksaga@163.com,邮件主题为“ThinkPHP5实战”。本书开发环境

操作系统:Windows10专业版

Web服务器:PHP自带

PHP版本:PHP 7.2.5(NTS)(ThinkPHP 5要求PHP版本大于等于5.6即可)

IDE:PHPStorm 2018.1

ThinkPHP版本:ThinkPHP 5.0.19(本书提到的ThinkPHP 5即指这个版本)

浏览器:Google Chrome 66(更高的版本也没有问题)本书适合读者●  Web开发爱好者●  拥有PHP基础想深入学习PHP大型项目开发的人员●  大中专院校以及培训机构的讲师●  初/中级网站开发人员著 者2019年8月第1章 搭建开发环境1.1 下载开发工具/软件“工欲善其事,必先利其器”。为了给后续的学习打下基础,避免由于环境不一致而导致的问题,本节将简述开发环境。下面的链接仅供参考,如果有变动,请到相关网站查找并下载。(1)下载PHP7.2.5,下载链接为https://windows.php.net/downloads/releases/php-7.2.5-nts-Win32-VC15-x64.zip。(2)下载PHPStorm,下载链接为http://www.jetbrains.com/phpstorm/download/#section=windows。(3)下载Chrome浏览器,下载链接为http://rj.baidu.com/soft/detail/14744.html。(4)下载ThinkPHP 5.0.19核心版,下载链接为http://www.thinkphp.cn/donate/download/id/1148.html。(5)将下载的PHP解压之后,添加PHP目录到操作系统的PATH环境变量中。1.2 HelloWorld

几乎所有的编程语言入门都是从HelloWorld开始的,本书也不例外。

解压ThinkPHP 5压缩包之后打开PHPStorm,如图1-1所示。图1-1

点击Open菜单打开刚才解压的目录,打开之后会进入IDE主界面,如图1-2所示。图1-2

点击图1-2左下角画红框的按钮会打开扩展菜单,然后点击Terminal打开控制台,如图1-3所示。图1-3

输入“php -S localhost:8080 -t public”,如图1-4所示。图1-4

如果命令执行错误,请检查PHP环境变量是否配置正确。

命令参数解释:●  -S:启动开发服务器(PHP5.4+自带)并设置监听地址。●  -t:设置Web根目录,ThinkPHP对安全的要求是Web目录和PHP源代码分离,故将public目录单独作为Web目录,源码不在该目录中,有效地提升了服务器的安全性。

打开Chrome浏览器,输入“http://localhost:8080”,输出如图1-5所示。图1-5

恭喜你,本书学习的第一步已经完成。

如果看不到上面的输出,请到Github上面提issue,作者会耐心解答。第2章 配置系统

目前大部分框架的习惯都是“配置大于编码”,ThinkPHP 5也不例外。配置优先的方式可以让我们只修改配置部分,不需要修改程序源代码,有效减少了程序出错的可能。

ThinkPHP 5默认使用PHP数组方式定义配置,支持惯例配置、公共配置、模块配置、扩展配置、场景配置、环境变量配置和动态配置。

ThinkPHP 5的配置非常灵活,举一个简单的例子:假设你在家里、公司两个不同的地点开发同一个项目,通过配置app_status,系统就会自动加载不同环境下的配置文件,实现“无缝开发”。

怎么样?是不是很期待呢?那就跟我一起来学习一下ThinkPHP 5的配置吧!2.1 配置的路径

ThinkPHP 5默认配置目录为application目录,该目录(不包括子目录)下的文件为全局配置,整个程序都可以访问到。如果是模块(如index模块)下的配置,就只对该模块生效。

如果需要将application/config.php的配置按照组件拆分(如拆分为数据库配置、缓存配置等)为多个文件,那么请放在application/extra目录下,文件名为键名,文件直接返回数组即可。

将配置文件拆分有利于规范项目文件结构,尽量做到单一职责,一个配置文件只负责一个组件/功能。2.2 配置的格式

ThinkPHP 5默认的格式为PHP数组,这也是ThinkPHP 3的做法,不过需要注意的是ThinkPHP 5推荐数组键名使用小写,而ThinkPHP 3的键名是大写。键值支持PHP所有数据类型,包括简单类型(字符串、数字、布尔值等)以及嵌套数组等。2.3 配置的加载顺序

在本章开始的时候提到过ThinkPHP 5支持多种配置,这就会带来一个问题,即配置的加载顺序如何?如果不弄清楚这个问题,在实际开发中可能会出现由于配置冲突、覆盖之类的问题而一时找不到问题出在哪里。

ThinkPHP 5配置加载顺序如下:(1)框架配置(框架自带的默认配置)。(2)全局配置(application/config.php)。(3)扩展配置(application/extra目录下的配置文件)。(4)场景配置(上文提到的app_status常量,如定义app_status为company,框架就会加载application/company.php配置)。(5)模块配置(application/模块名/config.php,支持app_status常量,如第4点的app_status则会加载application/模块名/company.php配置)。(6)动态配置(使用Config类进行操作)。

可以看到优先级是从上到下越来越低,希望读者能记住配置的加载顺序,这个顺序在开发中会带来很大的方便。2.4 配置的读写与示例

使用配置的最终目的是方便开发,也就是在合适的时候需要读写配置,比如实例化数据库的时候需要读取database配置。ThinkPHP通过Config::get和Config::set读写配置。

下面我们来看配置的一个示例,这个示例将完成以下内容的验证:●  惯例配置的加载●  全局配置的加载●  扩展配置的加载●  场景配置的加载●  模块配置的加载●  动态配置的加载与读写

步骤说明如下:(1)解压缩ThinkPHP 5核心版。(2)运行PHP服务器,启动命令参照1.2节的相关内容。(3)编辑application/index/controller/Index.php:(4)访问http://localhost:8080,可以看到输出了一段JSON,这就是ThinkPHP的默认配置(惯例配置)。(5)新建application/extra/amqp.php文件(如果extra目录不存在,就手动创建)。(6)刷新页面,可以看到有刚才配置的amqp配置。(7)将application/config.php的app_status更改为home。(8)添加application/home.php。(9)刷新页面,可以看到amqp的输出已经变成home.php中定义的内容。(10)添加application/index/config.php。(11)刷新页面,发现amqp又发生了变化,与上面定义的文件一致。(12)添加application/index/home.php。(13)继续刷新页面,发现amqp又发生了变化,与上面定义的文件一致。(14)编辑application/index/controller/Index.php,添加rw方法测试配置的读写。(15)访问http://localhost:8080/index/index/rw,可以看到如下输出: NULL string(3) "111"2.5 小结

经过本章的学习与示例项目的演示,验证了我们本章学习的所有知识,希望大家能够全部掌握,为后续的学习打下基础。

本章代码地址:https://github.com/thinkphp5-inaction/config-demo。第3章 路由

ThinkPHP 5采用的默认规则是PATHINFO模式,也就是如下的URL形式: http://server/module/controller/action/param/value/

与ThinkPHP 3最大的不同是ThinkPHP 5的路由更加灵活,支持路由到模块的控制器/操作、控制器类的方法、闭包函数和重定向地址,甚至是任何类库的方法。

需要注意的是,ThinkPHP 5的路由是针对应用而不是模块,所以路由是针对某个应用下的所有模块。如果需要按照模块定义路由,就需要自定义如下入口文件:3.1 路由模式

ThinkPHP 5的路由通过url_route_on和url_route_must来控制路由行为。根据这两个配置,存在三种路由模式:普通模式、混合模式和强制模式。3.1.1 普通模式

禁用路由,系统按照PATHINFO模式解析请求: 'url_route_on' => false,3.1.2 混合模式

系统按照PATHINFO模式+路由定义解析请求: 'url_route_on' => true, 'url_route_must'=> false,

若定义了路由,则执行路由,否则按照PATHINFO解析。3.1.3 强制模式

该模式下所有请求必须设置路由,否则抛出异常: 'url_route_on' => true, 'url_route_must' => true,3.2 路由定义3.2.1 编码定义

顾名思义,就是使用硬编码的形式进行定义(区别于配置式定义)。一般路由定义在application/route.php文件中,注册形式如下: Route::rule('路由表达式','路由地址','请求方法','路由条件','变量规则');

例如,下面的注册代码将会使访问“/news/”新闻ID的链接路由到index模块的News控制器的read方法: Route::rule('news/:id','index/News/read');

由于ThinkPHP 5的路由是针对所有模块的,所以定义的时候需要加上模块名。

ThinkPHP 5支持GET、POST、PUT、DELETE以及任意(*)请求方法定义。系统内置以下方法来简化路由定义: Route::get('news/:id','News/read'); // GET Route::post('news/:id','News/update'); // POST Route::put('news/:id','News/update'); // PUT Route::delete('news/:id','News/delete'); // DELETE Route::any('new/:id','News/read'); //任意请求方法

如果一个路由可以同时支持多种请求方法,可以使用“|”符号,意思和“或”一致。例如,有如下定义: Route::rule('news/:id','index/News/read', 'GET|POST');

则该路由允许POST和GET请求方法访问。3.2.2 配置定义

通过返回数组来定义路由,而且可以批量定义,简化代码编写量。该定义方式和ThinkPHP 3很相似,但是不支持正则定义。例如: 'index/index/index', 'news/:id' => 'index/News/read', // 变量定义 'news/[:id]' => 'index/news/read', // 可选变量定义 'news/:id$' => 'index/news/read', // 完全匹配 'user/:id' => 'index/user/show?status=1', // 传递隐式参数 // 限制变量类型 'post/:id'=> ['index/post/show',['ext'=>'html'],['id'=>'\d{4}']], ];3.3 路由条件

路由条件的意思是即使当前的URL满足了路由定义的地址,也可以通过控制路由条件来决定允许/拒绝该请求,提升了路由的灵活性。

可用的路由参数如表3-1所示。表3-1 路由参数

示例:3.4 路由地址

路由地址就是路由匹配成功之后需要执行的操作。ThinkPHP 5支持以下几种方式:●  路由到模块/控制器●  重定向●  路由到控制器方法●  路由到类静态方法●  路由到闭包函数3.4.1 路由到模块/控制器 'news/:id' => 'index/news/read'

控制器定义如下:

控制器支持无限级设置,例如下面的路由定义将会执行app\index\controller\site\news控制器的read方法: 'news/:id' => 'index/site.news/read'3.4.2 重定向

重定向和路由的区别是,重定向会在浏览器中产生一次301或302响应,而路由是浏览器无感知的。

重定向以“/”(站内,请特别注意不要忘记斜杠)或“http”或“https”开始,站内跳转如下: 'news/:id' => '/news/show/:id.html'

访问/news/id链接时,浏览器将会产生301响应,跳转到/news/show/id.html地址。

站外跳转如下: 'news/:id' => 'http://www.example.com/news/:id.html'3.4.3 路由到控制器方法

这种方式看起来似乎和第一种是一样的,但是不需要去解析模块/控制器/操作,同时也不会去初始化模块。例如,下面的定义将会执行index模块的news控制器的read方法: 'news/:id' => '@index/news/read'

由于是直接路由到控制器方法,因此获取当前模块名、控制器名、操作名会报错,因为ThinkPHP没有初始化这些变量。3.4.4 路由到类静态方法

此类路由支持任何类的静态方法,包括控制器。例如,下面的定义将会路由到index模块中News控制器的静态read方法: 'news/:id' => 'app\index\controller\News::read'3.4.5 路由到闭包

此类路由直接在application/route.php中定义,典型的例子如下: Route::get('news/:id',function($id){ return '访问'.$id.'的新闻'; });3.5 Restful路由3.5.1 普通资源

Restful路由的核心是通过标准HTTP方法来操作/获取数据,所以设计路由的时候尽量以请求资源为核心。

ThinkPHP 5对Restful路由的支持比较完善,通过以下两种方式都可以定义Restful路由:(1)编码定义 Route::resource('news','index/news');(2)配置定义

以news资源为例,ThinkPHP 5会自动注册7个路由规则,对应控制器不同的操作方法,如表3-2所示。表3-2 路由规则说明

需要注意的是,Restful标准中一般有以下几种请求:●  GET:获取单个资源或资源列表,返回单个JSON或列表JSON。●  POST:创建资源,返回创建后的JSON。●  PUT:编辑资源,返回编辑后的JSON。●  DELETE:删除资源,返回204状态码和空响应体。

对资源路由设计有深入兴趣的读者可以学习慕课网上的视频《Restful API实战》(https://www.imooc.com/learn/811)。3.5.2 嵌套资源

有时候资源是有上下级关系的,比如新闻的评论依赖于新闻,这时就需要用到嵌套路由定义。ThinkPHP 5对此也是支持的,例如:3.6 路由分组

如果同一个控制器的操作很多,在需要定义多个路由的情况下,可以将此类路由合并到一个分组,提高路由匹配效率。●  启用路由分组之前的定义:●  启用路由分组之后的定义:

在路由比较多的时候可以适当地采取该方式定义路由。

当分组访问到不存在的路由,例如定义了news分组但是没有定义delete方法,这时可以给news分组新增一个__miss__路由来捕获此类访问。3.7 全局404路由

与分组路由404类似,全局404路由也用来处理访问路由不存在的情况,不过作用域大一些,会捕获该应用所有的404。例如:

当访问到404时,系统将会执行index控制器的notfound方法。3.8 路由绑定

如果当前入口文件只需要使用index这个模块,就可以绑定路由来简化路由定义,否则每次都需要在路由地址声明完整路径(包括模块名)。

在入口文件中使用以下代码即可完成绑定: Route::bind('index');

绑定之后可以简化路由定义,例如以下代码就省略了index这个

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载