27.3. 微信公众平台开发

我看到网上很多人做法都是这样实现的

if input = '天气' {
	...
} else if(input = '饮食'){
	...
} else if(xxx){
....
} ....
....

switch (input){
	case '天气':
		xxxx
	case '饮食':
		xxxx
	case xxxx
		xxxxx
		...
		...
	default:
		xxxx
}

稍微高级的做法是,定义一个数组,或者一个hashmap,或者使用数据库实现key,value定义。然后判断keyword 是否存在,如果存在就处理 key 所对应的 value。

这样的做法会导致后期,极难维护,可读性极差,增加一个需求,就增加一段代码,新的代码会影响整个程序。国内开发者很喜欢使用if来拼接一个sql语句,这是坑爹的写法。

下面谈谈我思路,我将采用传统的MVC模式,

微信  ---post xml---> 入口URL
                      |
                      V
              +----------------+
              | Router         |     这里是路由映射,用户输入keyword 映射到 controller 上,
              +----------------+
                      |
                      V
              +----------------+
              | Controller     |     Controller 会加载请求的class 做一系列处理,包括数据模型处理,视图渲染,
              +----------------+
                      |
                      V
+--------------- Application -------------------+
| class xxx | class xxx | class xxx | class xxx |
+-----------------------------------------------+
                      |
                      V
               +--------------+
               | Model        |     处理数据
               +--------------+
                      |
                      V
               +--------------+
               | View         |     最后呈现xml。 微信会通过返回的xml将消息推送给用户
               +--------------+
		

任务处理图,程序应该有一个入口,多个出口,而不是层层循环,层层判断。一半来说for/if/while等等 超过三层,程序阅读就会非常困难。

                               .---> 终结
                              /                        .-->  终结
                             /            .--> 终结               /
                            /            /           /
微信 ---> Post XML ---> 接口程序 --------------------------------------------->  - 终结
                            \      \            \
                             \      `---> 终结               \
                              \                   `--->  终结
                               `--->  终结

实现菜单结构

<menu>
	<menuitem>
		<item>[1] 天气 </item>
		<controller></controller>
	<menuitem>
	<menuitem>
		<item>[2] 新闻 </item>
		<controller></controller>
	<menuitem>
	<menuitem>
		<item>[3] 饮食 </item>
		<submenu>
			<menuitem>
				<item>[31] 肯德基 </item>
				<controller></controller>
			</menuitem>
			<menuitem>
				<item>[32] 麦当劳 </item>
				<controller></controller>
			</menuitem>
		</submenu>
	<menuitem>
</menu>

XML 不太灵活,下面是数据库方案

CREATE TABLE menu
(
  id serial NOT NULL,
  mid integer, -- mid 字段
  menuitem character varying NOT NULL, -- menuitem 字段
  controller character varying, -- 映射控制器
  submenu_id integer, -- 子菜单ID
  status boolean DEFAULT true, -- 启用,禁用状态
  ctime timestamp without time zone DEFAULT now(), -- 创建时间
  mtime timestamp without time zone DEFAULT now(), -- 修改时间
  CONSTRAINT id PRIMARY KEY (id),
  CONSTRAINT submenu_id FOREIGN KEY (submenu_id)
      REFERENCES menu (mid) MATCH SIMPLE
      ON UPDATE RESTRICT ON DELETE RESTRICT,
  CONSTRAINT mid UNIQUE (mid)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE menu
  OWNER TO dba;
COMMENT ON TABLE menu
  IS 'menu table';
COMMENT ON COLUMN menu.mid IS 'mid 字段';
COMMENT ON COLUMN menu.menuitem IS 'menuitem 字段';
COMMENT ON COLUMN menu.controller IS '映射控制器';
COMMENT ON COLUMN menu.submenu_id IS '子菜单ID';
COMMENT ON COLUMN menu.status IS '启用,禁用状态';
COMMENT ON COLUMN menu.ctime IS '创建时间';
COMMENT ON COLUMN menu.mtime IS '修改时间';
		

数据

INSERT INTO "menu" ("mid", "menuitem", "controller", "submenu_id", "status") VALUES (1, '天气', 'weather', NULL, true);
INSERT INTO "menu" ("mid", "menuitem", "controller", "submenu_id", "status") VALUES (2, '新闻焦点', NULL, NULL, true);
INSERT INTO "menu" ("mid", "menuitem", "controller", "submenu_id", "status") VALUES (21, '国内新闻', 'news/1', 2, true);
INSERT INTO "menu" ("mid", "menuitem", "controller", "submenu_id", "status") VALUES (22, '国际新闻', 'news/2', 2, true);
		

这里id字段可有可无,实际上mid可以设置为主键,考虑到中国人习惯性才增加了id. submenu_id外键指向了mid 而没有指向id. 因为id是serial会顺序增加,会使整个菜单排序混乱。这样有也缺点,就是菜单项不能超过十个。

接下来实现路由到控制器的分发。

关注:显示菜单
[1] 天气
[2] 新闻焦点

发送:1
取出weather, 实例化 weather 类 执行index() 方法。 返回天气预报
$weather = new Weather()

发送:2
[21] 国内新闻
[22] 国际新闻

发送:21
实例化 news 类,构造方法参数指定为 1 返回国内新闻列表
$news = new News(1);
		

当 submenu_id 为 NULL 时表示他有子菜单,如果非 NULL 就取controller参数。

接下来要做的就是需求增加,只需要在menu表中增加一个记录,然后开发对应的controller. 有一些不使用的项目随时可以将status设置为禁用状态

原文出处:Netkiller 系列 手札
本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

时间: 2024-10-15 17:56:44

27.3. 微信公众平台开发的相关文章

微信公众平台开发入门教程

在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/JS等基础. 我们将使用微信公众账号方倍工作室作为讲解的例子,二维码见底部. 本系列教程将引导你完成如下任务: 创建新浪云计算平台应用 启用微信公众平台开发模式 基础接口消息及事件 微信公众平台PHP SDK 微信公众平台开发模式原理 开发天气预报功能 第一章 申请服务器资源 创建新浪云计算应用 申请账号 我们使用SAE新浪云计算平台作为服务器资源,并且申请PHP环境+M

微信公众平台开发实现2048游戏的方法_php实例

本文实例讲述了微信公众平台开发实现2048游戏的方法.分享给大家供大家参考.具体如下: 一.2048游戏概述 <2048>是比较流行的一款数字游戏.原版2048首先在github上发布,原作者是Gabriele Cirulli.它是基于<1024>和<小3传奇>的玩法开发而成的新型数字游戏 . 随后2048便出现各种版本,走各大平台.由Ketchapp公司移植到IOS的版本最为火热,现在约有1000万下载,其名字跟原版一模一样.衍生版中最出名的是<2048六边形&

《微信公众平台开发:从零基础到ThinkPHP5高性能框架实践》——2.2 程序开发基础

2.2 程序开发基础 PHP(超文本预处理器,Hypertext Preprocessor)于1994年由Rasmus Lerdorf创建,他也被称为"PHP之父".PHP是一种通用开源脚本语言.其语法吸收了C语言.Java和Perl的特点,便于学习,使用广泛,主要适用于Web开发领域.PHP是最受欢迎的Web开发语言之一,也是微信公众平台开发使用最广泛的语言. SQL是结构化查询语言(Structured Query Language)的简称,它是一种数据库查询和程序设计语言,用于存

微信公众平台开发(104) 自定义菜单扫一扫、发图片、发地理位置

关键字:微信公众平台 自定义菜单 扫一扫 发图片 发地理位置作者:方倍工作室原文:http://www.cnblogs.com/txw1958/p/weixin-menu-new-type.html    自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的重要功能.微信增加了点击菜单后调起扫一扫(支持二维码/一维码).发图片.发地理位置的能力,需开发实现.原有自定义菜单开发权限的公众号,均可获得以上能力. 在这篇微信公众平台开发教程中,我们将介绍如何在自定义菜单上开发扫一扫.发图片.

微信公众平台开发(44)历史上的今天

微信公众平台开发 历史上的今天 当年今日作者:方倍工作室 原文: http://www.cnblogs.com/txw1958/p/weixin-44-history.html   一.历史上的今天 回顾历史的长河,历史是生活的一面镜子:以史为鉴,可以知兴衰:历史上的每一天,都是喜忧参半:可以了解历史的这一天发生的事件,借古可以鉴今,历史是不能忘记的. 这里你可以阅读每一天的历史故事,每天发生了哪些大事,历史上谁诞生和逝世了,每天都是什么纪念日.节日,在这里你都可以容易浏览到!在我们生活中,日历

微信公众平台开发(89) 高级群发接口

 在这篇微信公众平台高级接口开发教程中我们将介绍如何使用接口实现微信公众平台群发功能. 本文分为以下四个部分 准备群发内容 选择群发对象 执行群发 接收群发结果   一.准备群发内容 群发内容可以是文本.图片.语音.视频.图文.群发文本只需要文本内容其他内容需要获得相应的media_id. 1. 文本内容 文本内容就是一段文字比如"微信公众平台开发最佳实践" 2. 图片.语音.视频 要求如下 图片image: 128K支持JPG格式 语音voice256K播放长度不超过60s支持AMR

微信公众平台开发(94) 违章查询

  在微信公众平台开发违章查询是一件比较辛苦的事,因为违章查询的数据在各省市公安部门的服务器上,对外只有网页查询提供,所以只有去分析网页,然后通过模拟提交来实现. 黑龙江违章查询地址为 http://www.hljjj.gov.cn:8081/Home/Wfcx 实际查询时,抓取到的请求如下 通过查看网页源码得到验证: 1 <script type="text/javascript"> 2 function error() { 3 showDialog(false); 4

微信公众平台开发(82) 天气预报

在这篇教程中,我们将介绍如何在微信公众平台上开发天气预报功能.我们将使用中国天气网的气象数据接口来获取天气信息. 这篇教程将介绍以下内容: 获取中国天气网的气象数据 在微信公众平台中回复天气   一.中国天气网 中国天气网提供了丰富的气象数据接口.下面我们介绍主要的几个: 国家根节点接口: http://flash.weather.com.cn/wmaps/xml/china.xml 该接口以XML格式列出所有的省(自治区.直辖市)的中文名称(quName)和拼音名称(pyName)及省会城市的

微信公众平台开发(100) 2048游戏

  微信开发第100篇了,算上微信支付和微信小店,其实已经超过了,这次完整讲一下2048游戏吧. 一.2048游戏 <2048>是比较流行的一款数字游戏.原版2048首先在github上发布,原作者是Gabriele Cirulli.它是基于<1024>和<小3传奇>的玩法开发而成的新型数字游戏 .随后2048便出现各种版本,走各大平台.由Ketchapp公司移植到IOS的版本最为火热,现在约有1000万下载,其名字跟原版一模一样.衍生版中最出名的是<2048六边