环境:
- TP 5.07
- 应用项目
- 核心框架
- 下载
- Composer
- git
- 直接下载
- PHP 5.6
- PostMan(Fd)
- phpstorm(减少鼠标使用率)
- 快速切换文件 alt + 左右
- ctrl + shift + n 查找文件
- 查找使用过文件(recent files) alt + r
- ctrl + shift + f(查找)/r
- alt + 1 快速选中代码块
- 焦点位于文件目录,alt + insert
- 主题切换 ctrl + ~
- F12 类文件跳转
- ctrl + alt + o 删除无用空间
- 插件
- Key promoter
- AceJump模式后(默认是Ctrl+J),再按任一个字符,插件就会在屏幕中这个字符的所有出现位置都打上标签,你只要再按一下标签的字符,就能把光标移到该位置上。
- 单元测试(业务代码过长)
- Extend Selection ,默认快捷键是Ctrl+W。
XDEBUG(一定要注意配置内容)
不过还是没有一个静态ide key
zend_extension = F:\phpStudy\php\php-7.0.12-nts\ext\php_xdebug-2.5.4-7.0-vc14-nts.dll
[xdebug]
xdebug.remote_enable = off
xdebug.profiler_enable = off
xdebug.profiler_enable_trigger = off
xdebug.profiler_output_name = cachegrind.out.%t.%p
xdebug.profiler_output_dir = "F:/phpStudy/php/tmp"
xdebug.show_local_vars=0
xdebug.idekey=PHPStorm
xdebug.remote_enable = On
xdebug.remote_host=localhost
xdebug.remote_port=9001
xdebug.remote_handler=dbgp
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
PATH_INFO URL
多模块与模块命名空间
app\ 是 TP5应用程序,也就是根的命名空间
自动创建命名空间
配置虚拟域名简化URL路径
外部Url
public注意隐私性
-
- 虚拟域名
- Apache服务器重写
路由模式
- route.php配置
- 动态注册
Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)')
- 1
- 请求类型
- GET
- POST
- DELETE
- PUT
- *
获取请求参数(3种)
Route::get('hello/:id','simple/Test/hello');
然后在方法中接受参数
?name=wangchunlong
- 1
- 2
- 3
通过Request(不区分HTTP请求类型)
$all = Request::instance()->param();
$all = Request::instance()->get();
$all = Request::instance()->route(); 路径中的参数
var_dump($all)
- 1
- 2
- 3
- 4
助手函数
获取所有参数
input('param.')
- 1
- 2
依赖注入
业务需求
搭建架构(重要)
独立验证
批量验证batch()
- 1
验证器(封装性更好)
程序架构
REST
英文:Representational State Transfer,又称具象(表述性)状态传输
一种风格,约束,设计理念
基于资源
https://www.zhihu.com/question/27785028 (回答的很详细)
REST模式与复杂的SOAP和XML-RPC相比更加简洁
SOAP
SOAP(Simple Object Access Protocol,即简单对象访问协议)是交换数据的一种协议规范,使用在计算机网络Web服务(web service)中,交换带结构信息。SOAP为了简化网页服务器(Web Server)从XML数据库中提取数据时,节省去格式化页面时间,以及不同应用程序之间按照HTTP通信协议,遵从XML格式执行资料互换,使其抽象于语言实现、平台和硬件。
RESTFul API
REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。
使用 RPC 样式架构构建的基于 SOAP 的 Web 服务成为实现 SOA 最常用的方法。RPC 样式的 Web 服务客户端将一个装满数据的信封(包括方法和参数信息)通过 HTTP 发送到服务器。服务器打开信封并使用传入参数执行指定的方法。方法的结果打包到一个信封并作为响应发回客户端。客户端收到响应并打开信封。每个对象都有自己独特的方法以及仅公开一个 URI 的 RPC 样式 Web 服务,URI 表示单个端点。它忽略 HTTP 的大部分特性且仅支持 POST 方法。
- 通常使用JSON描述数据
- 无状态
URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。
- HTTP动词(幕等性,资源安全性)
- POST:创建
- PUT: 更新
- GET:查询
- DELETE:删除
- 200 GET查询成功
- 201 POST创建成功(有可能包涵PUT)
- 202 PUT更新成功(请求发送,但是服务器还没有处理)
- 404 资源没找到
- 400 参数错误
- 401 未授权
- 403 资源禁止
- 500 服务器未知错误(服务器原因,未知Bug)
模仿
- 外部开发
- 豆瓣API
- GitHub开发者API
- 切勿盲目照搬标准REST
全局异常处理(AOP)
在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
Exception流程
固有的处理异常的思维模式与流程
- 记录日志状态不要去配置文件config里面去写变量,一般是读取Config::get().
- 如果要记录变量(数据状态),可以使用数据库或者是Redis,TP5自带缓存,全部变量
- 调试方法:类名追踪,查看继承关系,F12
- HTTPException和Exception不是继承关系
数据库与ORM
- ORM
- 简化代码编写
- 可以跨数据库
- 模型和数据访问层是两个不同的概念,模型处理业务,Db查询数据库,模型建立于Db
- 不要因为模型性能差(慢),放弃模型
- 高级语言都有性能损耗,框架也有,为什么使用框架?开发周期,效率
- 使用面向对象设计模型
- 模型底层还是数据访问层,自动,强化
原生sql语句
$result = Db::query('select * from banner_item where banner_id=?',[$id]);
return $result;
- 1
- 2
构造器操作数据库
- Db数据库操作入口对象(连接,增删改查…)
- 工厂模式(根据配置文件来选择不同驱动Drivers,进而区分不同数据库)
- 实例化Collection对象(PDO)
- 惰性连接,使用时才链接
- 查询Query(隐藏差异性,差异没有解决,也就是面向对象的封装性)
- 对CURD的一种封装(创建、更新、读取和删除)
- 链式操作
- Builder(四种不同类型)把query封装语句翻译成原生sql语句,返回给collection,执行
- 适配不同类型的数据库
- Drivers(thinkphp-db-connector)
- -
$result = Db::table('banner_item')->where('banner_id','=',$id)->find(); 返回一维数组,一条数据里面所有的属性
$result = Db::table('banner_item')->where('banner_id','=',$id)->select(); 返回二维数组
- 1
- 2
闭包
$result = Db::table('banner_item')
->where(function($query) ues ($id){
$query->where('banner_id','=',$id)
})->select();
- 1
- 2
- 3
- 4
- 5
- 6
- table和where操作返回的只是query对象,辅助方法,链式方法。
- find,select,update,delete,insert才会执行sql语句
- 非链式调用方法直到执行sql语句才会自动回收,清除状态
- where(字段名,表达式(不区分大小写,默认值=),查询条件),where写法:表达式,数组法(不灵活,略),闭包
- fetchSql() 返回sql语句,也就是查询构造器最终生成的sql代码
- 开启sql日志,确定打开debug和sqldebug,然后在log级别中添加sql字符串。前提是type:file,全局
使用模型和关联模型操作数据库ORM(object relation mapping对象关系映射,一个表就是一个对象)
表与表不再是外键的关系,而是对象与对象之间的作用关系
模型:数据查询,业务逻辑……..(一个业务,根据功能划分,不只有一个对象,有可能多个对象)
模型(模型层)不只有一层,可以划分多层,还有model,service,
Db(数据访问层)的劣势就是不能很好的处理业务逻辑
Db是模型的基石
关联模型->重表
继承Model
数据库表名和模型名(文件名)一一对应
如果要自定义的话,需要添加 protected $table = '表名';
- 1
- 2
- 3
自动生成banner模型
php think make:model 应用名api/模块名
- 1
- 2
静态调用(推荐)调用简洁,模型本质
$banner = BannerModel::get($id);
实例对象调用
$banner = new BannerModel(); 具体数据记录
$banner = $banner->get($id);
- 1
- 2
- 3
- 4
- 5
- get 返回一个模型对象,model特有
- find 返回一个模型对象,Db
- all 一组,model特有
- select 一组,Db
开闭原则(对修改关闭、对扩展开发)
数据冗余(数量不可控查询,多次使用,减少嵌套查询,减少服务器压力)
- 缺点
- 写入时需要多次写入
- 更新也要同时修改(数据不一致)
接口粒度与接口分层
- 架构
- 分层(底层粒度小->高层粒度大)
- 基础层-业务层-页面层
- 粒度过大,复用性不好
- 粒度过小,客户端调用不方便,调用过多HTTP请求
- 请求异步?数据合并
Token令牌
- 合法性
- 有效性
- 有权限
- openid 用户身份的唯一标识,功能,一定
- code 数字码
- session_key 拿到并且解密信息
如果直接Post传递,令牌A传递B用户Body信息,令牌A可以修改B的信息。
hasOne,belongsTo区分 一对一,使用表Model如果包含连接外键,使用belongsTo
下单与支付(最复杂)
客户端Token验证
项目源码
https://github.com/Paladinhanxiao/Tp5WechatShop
本文转载自:https://blog.csdn.net/qq_33936481/article/details/75267295