`
jiava9900
  • 浏览: 87534 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

单一入口应用程序概述

阅读更多

    什么是单一入口应用程序?

在解释什么是单一入口应用程序之前,我们先来看看传统的 web 应用程序。
news.php 显示新闻列表
news_edit.php 显示新闻编辑页面
这两个页面不但分别实现了两个功能,还成为了应用程序的两个入口。

那什么是入口啊?
打个比方,大家上 WC,都是男生进一个门,女生进一个门。这两个门就是 WC 的两个入口。

呵呵,上面的例子应该很好理解吧。那稍微变换一下,单一入口的概念就很容易理解了。
现在我们是进一个公共 WC,不管男女都是从最外面的入口进入,交了钱以后才分别进两个门。那最外面的入口就是这个 WC 的单一入口。

所以单一入口的应用程序实际上就是说用一个文件处理所有的 HTTP 请求。例如不管是新闻列表功能还是新闻编辑功能,都是从浏览器访问 index.php 文件。这个 index.php 文件就是这个应用程序的单一入口。


index.php 如何知道用户是要使用哪一个功能呢?

很简单,我们访问 index.php 时跟上一个特定的参数就行了。例如 index.php?action=news 就是显示新闻列表,而 index.php?action=news_edit 就是新闻编辑。

而在 index.php 里面,仅用两行代码就可以实现这种效果。
<?php
$action = $_GET['action'] == '' ? 'index' : $_GET['action'];
include('files/' . $action . '.php');
?>

上面的代码中,第一行是从 url 中取出 action 参数。如果没有提供 action 参数,就设置一个默认的 'index' 作为参数。
第二行代码就是根据 $action 参数调用不同的代码文件,从而实现单一入口对应不同功能的效果。


单一入口应用程序的入口文件很复杂?


有些朋友可能以为单一入口程序的 index.php 会像面条一样复杂,其实是误解。
例如我现在的应用程序入口文件只有下面几行:
<?php
define('APP',       realpath('../libs/website'));
define('LANG',      'gb2312');
define('DEBUG',     1);

require('../libs/flea1/basic.php');
run();
?>
足够简单了吧?

当然了,在 index.php 里面写上一长串 switch case 绝对是拙劣的实现方式。但这纯粹是开发者自己的设计和实现问题,而不是单一入口应用程序这种设计思想的问题。

补充说明: 这里提到 switch case 并不是说用了 switch 就代表“落后”、“土气”等。只是说在 index.php 这个入口程序里面写上一堆 switch case 不利于程序的修改和维护,所以是一种不好的用法。


单一入口应用程序的设计思想

当web服务器(apache或者iis)收到一个http请求时,会解析该请求,确定要访问哪一个文件。例如 http://www.xxx.com/news.php 的解析结果就是要求web服务器解析 news.php 文件,并返回结果给浏览器。现在看看单一入口应用程序的 index.php 文件,就会发现 index.php 实际上根据 url 参数进行了第二次解析。

完成这个解析的程序一般称为 Dispatcher(中文的准确翻译我也不知道),大概意思就是将不同的请求转发到不同的处理程序进行处理。

在单一入口应用程序中,index.php 和 web服务器一起构成了一个 Dispatcher,根据 http 请求和 url 参数来确定请求的处理程序。

了解了 Dispatcher 的概念后,我们可以发现前面提到的两行代码实际上就是一个最简单的 Dispatcher 实现:
<?php
$action = $_GET['action'] == '' ? 'index' : $_GET['action'];
include('files/' . $action . '.php');
?>

诚然,对于一个安全、健壮的应用程序,Dispatcher 肯定不是上面那么简单。在调用实际代码前,还会加上各种判断、安全性检查等。例如判断 url 指定的功能是否可以访问以及 url 中包含了无效的参数。

看到这里,朋友们肯定会说:单一入口程序就多了就这样一个 dispatcher ,和我直接做成 news.php、news_edit.php 等单个文件相比有什么好处啊?


单一入口应用程序的优势

单一入口应用程序的所有http请求都是通过 index.php 接收并转发到功能代码去的,所以我们在 index.php 里面就能完成许多实际工作。

这里我只拿安全性检查为例详细说明一下:
由于所有的 http 请求都由 index.php 接收,所以可以进行集中的安全性检查。如果不是单一入口,那么开发者就必须记得在每一个文件的开始加上安全性检查代码(当然,安全性检查代码可以写到另一个文件中,只需要include进来就可以了)。
但我想大家都是懒人,也许记性也不好,难免有忘记的时候。因此要记得在每一个文件前面都加上必要的include可不是件容易做到的事情。

与安全性检查类似。在入口里,我们还可以对url参数和post进行必要的检查和特殊字符过滤、记录日志、访问统计等等各种可以集中处理的任务。

“咦,搞这么多功能,不是会把 index.php 搞得很复杂吗?”
“不会的。只需要把各种功能写到单独的文件,然后在index.php里面include进来就可以了!”

可以看出,由于这些工作都被集中到了 index.php 来完成,可以减轻我们维护其他功能代码的难度。例如在10个文件中保持头部的几个include都一致可不是件让人愉快的事情。


单一入口应用程序的缺点

任何事情都有两面性,单一入口应用程序也不例外。由于所有 http 请求都是针对 index.php,所以应用程序的 url 看起来确实不那么美观。特别是对搜索引擎来说很不友好。

要解决这个问题,可以采用 url 重写、PATHINFO 等方式。但我个人更推荐在前台页面不使用单一入口方式,而是保持多个文件入口。或者两者混用。例如新闻列表采用单独的 news.php 显示,而用户注册、发表信息等则采用单一入口。因为对于网站拥有者来说,新闻列表、新闻显示页面才是需要搜索引擎关注的高价值目标,而用户注册页面等交互性功能则根本没有收录的价值。

有朋友提到单一入口的应用程序会有很长一串参数,那么我们分析一下下面这个 url:
index.php?url=news&amp;news_id=123&amp;page=2&amp;sort=title
如果改为直接访问 news.php,也只不过省掉了 url=news 这一个参数而已。

所以认为单一入口的应用程序 url 太复杂是没有道理的。


如何组织单一入口应用程序的功能代码?

单一入口应用程序最大的挑战来自于如何合理组织各个功能的处理代码。但只要遵循一定的步骤,也可以轻松的解决掉这个难题。

首先,对于应用程序的功能要做出一个合理的分解。例如后台的新闻栏目可能包含“添加新闻”、“编辑新闻”、“删除新闻”等多个功能。这时我们就可以将这一组逻辑上关联的功能组合到一个功能模块中,称为“新闻管理”模块。
按照上面的方法整理完应用程序的功能,我们就会得到多个功能模块,而每个模块又是由多个功能组成。(实际上,即便不是单一入口应用程序,功能的整理也是必须的步骤。)

整理完功能后,我们就需要确定如何存放各个功能的代码。这里我推荐两种方式:

1、每个功能模块一个子目录,目录里的每一个文件就是一个功能的实现代码。
这种方式的好处是每个功能的代码都互相隔离,非常便于多人协作。缺点是每个功能之间共享代码和数据不那么方便。例如新闻管理模块中的所有功能都需要一个“取出新闻栏目记录”的功能,那么采用这种多个独立文件的组织方式,“取出新闻栏目记录”就只能写在另一个文件中,然后由需要该功能的文件include进去。

2、每个模块一个文件,模块中的每个功能写成一个函数或者一个类方法。
好处不用多说了,非常便于共享代码和数据。缺点就是如果几个人同时改,容易发生冲突。不过借助版本控制软件和差异比较合并工具,冲突还是很容易解决的。


好了,我们的功能代码都确定存放方式了。那么如何调用呢?


index.php 如何调用功能代码?

调用首先就是要设计一个规则,然后让 index.php 根据这个规则来搜索和调用功能代码。就我自己来说,我总是使用 $_GET['url'] 来指定要调用的功能模块,而 $_GET['action'] 来指定该模块的特定功能。因此我的应用程序会使用如下的 url 地址:
index.php?url=news&amp;action=edit

觉得两个参数太多了?那可以使用 index.php?func=news.edit 这样的 url。只需要将 news.edit 拆开为 news 和 edit 就行了。

“嘿嘿,那我故意搞一个 index.php?url=news&amp;action=xxx,看你的应用程序还能运行?”
很显然,这样的 url 只会使得 index.php 无法找到需要的功能代码,最后报告错误。但是这和你在浏览器中访问 newsxxx.php 这个并不存在的文件有什么本质区别呢?

相反,我还可以让 index.php 在发现找不到需要的功能代码时显示一个漂亮的出错页面,并提供一个返回网站首页的连接。

在实际开发中,我倾向于将一些基本服务从应用程序中抽取出来,形成一个应用程序框架。这个框架通常会包含一个 Dispatcher、基本的数据库访问服务、模版引擎、常用的辅助功能等。由于有了一个框架,所以我可以更加让 Dispatcher 更加灵活。例如可以对某些功能模块应用权限检查,而另一些则不检查。


进一步了解单一入口应用程序

要深刻理解一个事物,自己尝试一下是最好的办法。

你可以选择自己实现一个 Dispatcher 以及相应的各种规则,或者选择一个现有的应用程序框架。但更好的方式还是首先尝试一下现有的框架,然后再自己尝试实现一个类似的。这样可以在最短的时间内获得最多的收获。

目前绝大多数 php 应用程序框架都是单一入口的,并采用了 MVC 模式(很遗憾,由于 MVC 实在太复杂,并且和单一入口应用程序也没有必然联系,所以我就不赘述了。感兴趣的朋友可以 google 一下相关资料)。

我个人推荐下面的框架:

FleaPHP
http://www.fleaphp.org/
嗯,我在做广告。因为这个框架是我做的。但我相信这个框架将是一个非常容易上手(就算不是最容易的)框架。
全中文的代码注释、简单的结构、精简的代码都是 FleaPHP 框架的优势。


CakePHP
http://www.cakephp.org/
一个 Ruby on Rails 的 PHP 仿制品。具有出色的功能,但显然太过于复杂,而且缺乏中文资料是个很大的问题。


symfony
http://www.symfony-project.com/
一个超复杂的框架,集成了 n 多东西。项目网站上提供的视频演示看上去很不错。


其他
还有 Mojavi、Phing 等许多 PHP 框架,如果你精力充沛,可以去探索一下。


转载自:http://www.chinaunix.net/jh/27/657028.html
 
0
0
分享到:
评论

相关推荐

    第1章C语言程序设计概述1

    - **主函数**:程序的入口点,一般形式为`int main(void) { ... }`或`int main(int argc, char *argv[]) { ... }`。 1.2.2 C 程序的运行过程 1. **编译**:将源代码文件(.c文件)通过编译器(如GCC)转换成目标...

    WinDriver™ USB User's Manual

    WinDriver™是一款开发工具包,它能够显著简化创建设备驱动程序和硬件访问应用程序的困难任务。WinDriver包括一个向导和代码生成特性,能够自动检测用户的硬件,并从应用程序中生成用于访问该硬件的驱动程序。使用...

    Visual C++基础基础教程

    - 单文档应用程序:专注于处理单一文档的GUI应用程序,如文本编辑器。 - 基于HTML文档的应用程序:结合HTML技术构建的GUI应用程序,适用于Web应用开发。 - **编写不同类型的应用程序**: - **控制台应用程序**:...

    c程序设计 知识要点

    - **直接访问内存**: C语言允许程序员直接操作内存地址,这使得它非常适合于需要高度定制和优化的应用程序,尤其是系统级编程。 - **硬件操作**: 由于可以直接访问内存,C语言也被广泛用于硬件相关的开发任务。 **...

    数据结构:第0章 C语言概述.ppt

    C语言是一种强大的、通用的编程语言,被广泛用于系统开发、软件工程、嵌入式系统以及各种应用程序。本章将对C语言的基础知识进行概述,包括其程序结构、函数、结构体、语句、动态内存分配以及指针。 0.1 C语言的...

    Windows 程序设计(第5版)(上、下册)--详细书签版

    10.3.7 菜单与加速键应用程序poppad 10.3.8 启用菜单项 10.3.9 处理菜单项 第十一章 对话框 11.1 模态对话框 11.1.1 创建about对话框 11.1.2 对话框及其模板 11.1.3 对话框过程 11.1.4 激活...

    C程序设计期中复习PPT学习教案.pptx

    【基本结构】在算法和程序设计中,通常涉及顺序、选择(条件)和循环(迭代)三种基本结构,它们都有单一入口和单一出口,确保了程序的流程控制。 这个学习教案的目标是让学生能够回顾计算机程序的基础,理解C语言...

    单片机原理及应用试题2007(A卷)标准答案.doc

    **单片机原理及应用知识点概述** 单片机是一种集成在单一芯片上的微型计算机系统,广泛应用于各种控制和数据处理领域。本试题涉及到单片机的基础知识,包括数据类型、寻址方式、指令系统、存储器组织以及中断系统等...

    最新微信小程序调研报告.pdf

    【微信小程序概述】 微信小程序是腾讯公司推出的一种轻量级应用开发平台,旨在提供一种无需下载安装即可使用的应用服务。自2017年推出以来,微信小程序以其便捷的使用方式和跨平台特性受到了广泛关注。它能够覆盖大...

    基于 NET技术平台的Web应用框架的设计与实现

    - **前端控制器模式**:通过使用单一的入口点来处理所有HTTP请求,简化了请求的路由和分发过程,同时也有助于集中管理全局的过滤器和拦截器。 - **依赖注入**:为了实现组件之间的解耦,MyFramework采用了依赖注入...

    ios开发技术

    - **控制台编程**:单一流程执行,通常用于命令行界面的应用程序开发。特点是单一输入输出流程,如输入-处理-输出等。 - **GUI编程**:多线程执行,适合图形用户界面(GUI)的应用程序。GUI编程需要同时处理多个输入...

    Android_API_Guides_v2016

    - **Android应用框架**:Android提供了一套丰富的应用程序框架,支持开发者在Java环境中构建创新性的应用程序和游戏。这对于初学者尤其重要,因为它涵盖了基本的概念,帮助开发者理解Android应用程序的构建原理。 #...

    第01章 Android简介及其开发环境的搭建

    5.2 活动(Activity):应用程序的单一屏幕,用户交互的入口点。 5.3 服务(Service):后台运行的任务,不与用户界面交互。 5.4 广播接收器(Broadcast Receiver):监听系统广播事件,进行响应。 5.5 内容提供者...

    C语言试卷25程序设计语言.pdf

    C语言是一种强大的、通用的编程语言,被广泛用于系统开发、软件工程、嵌入式系统以及各种应用程序的编写。它的设计强调效率和可移植性,因此成为许多操作系统、应用软件和硬件控制系统的首选语言。 1. C程序的执行...

    相关总结 微服务概述.docx

    微服务是一种架构设计模式,它提倡将单一应用程序分解为一组小型、独立的服务,这些服务各自运行在自己的进程中,且能够独立部署。每个服务都聚焦于业务领域的特定功能,通过轻量级通信机制(如HTTP RESTful API)...

    MFC教程知识全集2.pdf

    以上内容概述了《MFC教程知识全集2.pdf》中涉及的关键知识点,包括C++的基础概念、Windows应用程序的内部原理、MFC的应用程序框架以及如何在MFC应用程序中处理图形、文本和用户界面元素。这对于学习MFC和Windows应用...

    Android开发教程之使用_Android_和_XML_构建动态用户界面(一).

    | `XmlGui.java` | 定义了Android Activity的入口点,是应用程序的起点。 | | `XmlGuiForm.java` | 提供了一个表单的高级数据模型和相关方法,用于处理表单逻辑。 | | `XmlGuiFormField.java`| 表示一个表单域,持有...

    C语言复习提纲.doc

    - 三种基本构造:顺序结构、选择结构(if-else,switch)和循环结构(for,while,do-while),它们都具有单一入口和单一出口,确保程序的可控性。 3. **C程序的基本组成** - C程序由多个函数组成,至少包含一个...

Global site tag (gtag.js) - Google Analytics