小程序交流群:528215729,加入和小伙伴们一起探讨开发疑难、运营idea吧

admin

admin

发表于 2018-04-14 16:29:22

摘要:hinkPHP5.0+小程序商城 (微信小程序开发 - 微信 小程序外包开发-微信小程序 开发教程-微信小程序开发者社区,尽在 www.mntuku.cn)

这里写图片描述

环境:

  • 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:phpStudyphpphp-7.0.12-ntsextphp_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 = 表名;
自动生成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

下单与支付(最复杂)

这里写图片描述

553阅读 | 0评论
你的回应