技术标签: 第三方平台 Symfony 授权 微信 中介者 php
又好久没有写博客,最近主要做了两件事。一个是安卓SDK自动打包、加固、热更新的研究,一个是微信第三方平台的授权。第一个虽然有一定的成果,但还没有完善,后续会将过程和技术记录一下,现在先整理下微信第三方平台的授权。
有幸使用了世界上最好的语言,对于一个年长的程序员来说,语言的语法、函数、变量、特性、面向对象等其实就是在使用中渐渐熟悉,也没有太多研究的价值。不过公司项目的PHP有一个前人留下的通用框架,使用起来蛮方便的,就仔细翻了一下源码。
框架中使用了一个事件分发框架EventDispatcher,这是Symfony中的一个子框架,可以单独使用,设计使用了中介者模式,可以减少模块间的耦合度,同时加强系统的可扩展性。
源码地址:EventDispatcher
框架介绍:The EventDispatcher Component
这个设计模式网上一搜资料一堆,简单来说,就是将网状的耦合结构变成一个星形的松散结构。举个例子好理解一下:
现实中的同学相互联系,要组织个同学会,有可能A去叫B、B又去通知C,A不知道C已经被通知又可能再通知一次等等,画成图则如下:
很明显,这是一个耦合网状结构,哪一个人少了都有可能导致其他人通知不到,而且再往结构中加人时,设计会麻烦、易错。而中介者模式则设立一个中介者,所有交互都通过它来做。如上面的例子,所有同学都加入一个QQ群,则这个QQ群就是一个中介者,通知只要发在QQ群中,则所有同学都会被通知到。画成图表示如下:
中介者模式就是这样一个星形结构,在结构中加人时,设计简单、清晰,扩展性高,耦合度低。
之前也接触过这个设计模式,不过工作中用到的很少,刚好EventDispatcher这个框架用的是中介者模式,可以学习一下。
这个框架使用起来很简单:
这样,就将模块间相互调用转换为了事件触发,实现了模块解耦,结构也变得清晰,当然,由于没有了直接调用,源码阅读起来就麻烦多了^_^,这也是解耦的通病。
上文有源码的链接,代码比较简单,只有几个文件,就不具体分析了。
上面是公司框架用到的一个子框架,现在分析下主PHP框架。其实从总体来看,主要实现了几个模块:输入、输出、配置、功能。如下图:
然后就是其中具体的实现细节了,不过由于是公司正在使用的代码,不做分析。
微信有官方的授权文档说明:授权流程技术说明,文档里说得很详细,不过有的地方没有提,还有的地方容易出错,这里记录一下。
$encryptMsg = file_get_contents ( 'php://input' );
获取,不能使用$_POST
;自编码器文章目录自编码器简介特点应用结构分层训练方法香草自编码器栈式自编码器1.捆绑权重2.一次训练一个自编码器3.进行无监督预训练去噪自编码器简介神经网络就是一种特殊的自编码器,区别在于自编码器的输出和输入是相同的,是一个自监督的过程,通过训练自编码器,得到每一层中的权重参数,自然地我们就得到了输入x的不同的表示(每一层代表一种)这些就是特征,自动编码器就是一种尽可能复现原数据的神经网络。自编码器通过简单地学习将输入复制到输出来工作。这一任务(就是输入训练数据, 再输出训练数据的任务)听起来似乎微
Common SubsequenceTime Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other)Total Submission(s) : 1 Accepted Submission(s) : 1Problem DescriptionA subsequence of a give
mybatis
2019独角兽企业重金招聘Python工程师标准>>> ...
声明复数类Complex,成员变量包括double类型的实部real和double类型的虚部im,请定义如下成员方法:两个构造方法:Complex(double real, double im);Complex(),该无参构造方法内部用 this(0,0) 调用前一个构造方法;定义方法:public Complex add(Object obj) 实现两个复数相加;定义方法:public Complex minus(Object obj) 实现两个复数相减;重写Object的toString方法
标题与内容连接中间不显示边框布局:1.给最外层div加个宽度,包住标题和内容;2.标题用ul,li:给ul加下边框2px,高度30px,行高30px;给li加高度28px,行高28px;给选中li加上边框2px,下边框2px白色;<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <tit...
https://segmentfault.com/q/1010000018556609通过From中的getValueFromEvent可以控制!import React from "react";import ReactDOM from "react-dom";import "antd/dist/antd.css";import "./index.css";import...
BankAccountsusing System;using Wrox.ProCSharp;using Wrox.ProCSharp.VenusBank;using Wrox.ProCSharp.JupiterBank;namespace Wrox.ProCSharp{ class MainEntryPoint { static voi...
2021年11月15日16:00,XT.COM直播间又开播啦!本期做客直播间的嘉宾是来自DKKS的创始人Daikokuten、营销及传播负责人Eric以及开发负责人Otomo。错过直播的小伙伴一起跟着xt君来回顾一下此次直播主题AMA吧!(Q:XT.COMA:Daikokuten & Eric & Otomo)Q:Hi, everyone! Welcome to the XT AMA Channel. XT is honored to invite Daikok...
原文链接:http://allenhk.iteye.com/blog/1866288Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程。 如下图,Java程序从源文件创建到程序运行要经过两大步骤:源文件由编译器编译成字节码(ByteCode) 字节码由java虚拟机解释运行。因为java程序既要编译同时也要经过JVM的解释运行,所以说Java被称为半解...
ospfd/Makefileospfd/makefile.winospfd/ose_ipnet_makefile.mkospfd/OSPF-MIB.txtospfd/OSPF-TRAP-MIB.txtospfd/ospfd.cospfd/ospfd.conf.sampleospfd/ospfd.hospfd/ospf_abr.cospfd/ospf_abr.hospfd/ospf_api.cosp...