环境搭建
安装
Thinkphp 6.0运行环境要求php 7.1+。
参考Thinkphp 5.1安装过程,先下载PHP7.1+【也可能要下载VC++ 2015】,将php7在wampserver里配好后【需要开启openssl和mbstring拓展,建议开启curl拓展】,修改环境变量中系统变量里的php版本号,然后在项目目录下运行
composer create-project topthink/think tp
就可以安装上Thinkphp 6.0.*版本。
如果需要更新框架,那么就在应用文件夹所在根目录下运行
composer update topthink/framework
就会删除核心框架目录并重新下载,因此一般不要在核心框架目录里写代码或者修改代码。
简而言之
程序以app目录下是否有controller目录来判断是不是单应用程序,因此如果是多应用程序,那么需要app目录下不要有名称为controller的目录。
部署网站时,保障只有public目录可以对外访问,mac或linux环境下runtime文件夹权限应该设置为777。
环境变量里的配置名会全部转换为大写,值为off、no和false等效于false,值为on、yes和true等效于true。
Config类不再支持动态设置某个配置参数,但支持批量设置配置参数。
initialize()是框架自带的方法,子类的initialize()方法会自动调用父类的initialize()方法。
依赖注入的类统一由容器进行管理,一般是会自动绑定并实例化的。可以使用助手函数bind()手动绑定类到容器中,app()可用于快速获取容器里的对象实例【支持依赖注入】。
框架内置了一些系统服务类,主要用于核心类的依赖注入。系统服务类的register()方法用于将系统服务绑定到容器中,boot()方法用于定义启动某个系统服务之前需要进行的操作。通过系统服务可以保障相关组件在执行时已经完成了相关的依赖注入。
事件系统的所有操作通过think\facade\Event类静态调用完成。可以手动注册事件监听【Event::listen】和动态注册事件订阅【Event::subscribe】。
事件系统相比较行为系统的一个优势是事件本身可以是一个类,可以更好地支持事件订阅。事件相比较中间件的优势有定位更精确【粒度更小】,能降低系统耦合性。
应尽量在应用开发前完成路由规则的主体规划和定义。
路由到类的方法的格式为:
带上完整命名空间的类名@方法名 或者 带上完整命名空间的类名::方法名。
不要在控制器类中使用die或者exit方法,如果需要中断执行并推出,可用系统提供的halt()助手函数。
Response类不能实例化,需要用静态方法Response::create()【助手函数response()】来创建对象。获取响应对象实例的实际输出内容可以用getContent()方法。
重定向【redirect()】隐式传值使用的是session闪存数据隐式传值,仅在下一次请求有效。
新版的数据库和模型操作已经独立为ThinkORM库,要使用Db类必须通过门面方式(think\facade\Db)来调用。
构建子查询语句时,要注意有些Nosql数据库【如mongodb】可能不支持fetchSql()方法,这时可考虑用buildSql()或者闭包方法。
每个where子句【或闭包方法】里搜索条件生成的sql语句外部会用一个括号()括起来,可用多个where子句形成具有多个查询范围【()】的sql语句,默认以AND连接,如果需要改成OR连接,可以使用->whereOr([$map_array1,$map_array2])的方式。
查询事件是指数据库操作的回调事件,有before_find(),before_select(),after_insert(),after_update,after_delete(),查询事件只有当前查询对象这一个参数,可通过依赖注入传入额外参数,不需要在查询事件里返回值,不要在查询事件里用select()方法。
withAttr()方法用于给字段定义获取器【可用闭包方法处理字段】,可多次调用,获取器不支持find()和select()之外的方法。
如果自定义数据库驱动,需要自定义实现Connection类,还可能需要实现Query类,可通过继承系统类的方式实现系统类的一些功能。
模型字段名称跟数据表字段名称应该保持大小写一致。
create()方法的第二个参数用于指定允许写入的字段,create()方法返回的是当前模型类的对象实例。
实例化模型后调用save()方法系统会认为是新增,查询数据后调用save()方法系统会认为是更新。save()方法成功后会返回true,在before_update事件返回false的情况下save()方法会返回false,如果出现错误会自动抛出异常。
新增数据建议用create()方法,批量新增数据建议用saveAll()方法。
如果需要用到模型数据,建议先查询数据后用save()方法更新。如果不需要用到模型事件,或者更新前不需要查询【直接更新】,可以用模型类的静态方法update()更新数据,批量更新数据可以使用saveAll()方法,但建议尽量避免批量更新数据。不要在同一个模型实例里多次调用save()写入,这会导致部分重复数据不再更新。
调用模型类的delete()方法能够触发模型类里定义的事件处理,delete()方法返回布尔值。可以调用模型类的静态方法destroy()来根据主键值直接删除数据。
搜索器命名规范是“search字段名去掉下划线后的大驼峰写法Attr”,用于封装查询字段或者查询标识的查询表达式,只在调用withSearch()方法时触发,可以避免表单非法查询条件传入。
可以在模型类设置只读字段列表,保护这些字段值不被修改。
模板文件路径是相对于应用的入口文件所在目录进行定位,而不是相对于模板目录进行定位。
TP6.0里很多异常会自动抛出和捕获,可以通过throw()方法手动抛出异常,abort()方法快速抛出HTTP异常,可在app目录下的provider.php里绑定自定义异常处理类来处理异常。
TP6.0内置的上传类功能适用于上传文件到本地服务器,如果需要上传到远程服务器,可能需要安装额外拓展。
在命令行界面,切换到应用目录所在的根目录,运行
php think run
即可启动内置服务器,然后就可以用http://localhost:8000或http://l27.0.0.1:8000来访问网站应用了。关闭命令行界面后内置服务器就不能访问了。
可以在应用目录下新建一个build.php,用于配置命令行自定义生成应用的结构。
可以创建自定义命令类文件,需继承think\console\Command类。
验证码库需要开启Session才能生效,框架里的验证码字符库里已经去掉了lLo0这样的易混淆字符。