MVC前提之单一入口+例子

前端之家收集整理的这篇文章主要介绍了MVC前提之单一入口+例子前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
单一入口概述

单一入口的应用程序就是说用一个文件处理所有的HTTP请求,例如不管是列表页还是文章页,都是从浏览器访问index.PHP文件,这个文件就是这个应用程序的单一入口。

打个比方,大家都要上WC,都是男生进一个门,女生进一个门,这两个门就是WC的两个入口。而现在去一个公园里面的WC,外面还有一个门,不管男女都从最外面的门进入,交了钱以后才进入里面的男厕所门或女厕所门,而这个最外面的门就是这个WC的单一入口。

实现方式
很简单,可以在访问index.PHP时限上一个特定的参数。例如index.PHP?action=list就是访问列表页,而index.PHP?action=single则访问文章页

实现代码
$action=$_GET['action']==''?'index':$_GET['action'];//从url中取出action参数,如果没有提供action参数,就设置一个默认的'index'作为参数
include('files/'.$action.'.PHP');//根据$action参数调用不同的代码文件,从而满足单一入口实现对应的不同的功能

Index.PHP代码
  1. <?PHP
  2. $admincp_actions_founder=array('templates','db','founder','postsplit','threadsplit');
  3. $action=$_GET['action']==''?'index':$_GET['action'];
  4. $operation=$_GET['operation']==''?'index':$_GET['operation'];
  5. if(empty($action)){
  6. header('location:index.PHP?action=login');
  7. }elseif(in_array($action,$admincp_actions_founder)){
  8. include('files/'.$action.'.PHP');
  9. }
  10. ?>

$action.PHP

Java代码
  1. <?PHP
  2. if(!$operation){
  3. //doqueryfromdbandshowpage
  4. }elseif($operation=='list'){
  5. //doqueryfromdbandshowpage
  6. }elseif($operation=='remove'){
  7. //doqueryfromdbandshowpage
  8. }elseif($operation=='add'){
  9. //doqueryfromdbandshowpage
  10. }
  11. ?>

面向对象的调用方法

Index.PHP代码
  1. <?PHP
  2. require_once"RApp.class.PHP";
  3. $RApp=RApp::factory();
  4. $RApp->run();
  5. ?>
Rapp.class.PHP代码
  1. <?PHP
  2. classRApp{
  3. var$marty_tpl_name;
  4. function__construct(){
  5. }
  6. function&factory(){
  7. session_start();
  8. if(isset($_GET['act'])&&preg_match('/^[a-zA-Z0-9]*$/',$_GET['act'])&&include_once'Module/'.$_GET['act'].'.class.PHP'){
  9. $class_name=$_GET['act'];
  10. $class=&new$class_name();
  11. return$class;
  12. }else{
  13. $class=&newRApp();
  14. return$class;
  15. }
  16. }
  17. functionauto_load_methods(){
  18. if(method_exists($this,$do)){
  19. eval('$this->'.$do.'();');
  20. }else{
  21. eval('$this->default_page();');
  22. }
  23. }
  24. //首页·
  25. functionrun(){
  26. //logout
  27. if(@$_GET['logout']==1){
  28. $this->clean_session();
  29. header('Location:index.PHP?act=login');
  30. }elseif($_SESSION['uid']){
  31. header('Location:index.PHP?act=index&do=index');
  32. }else{
  33. header('Location:?act=login');
  34. }
  35. }
  36. functiondisplay_smarty(){
  37. $this->smarty->display($this->smarty_tpl_name);
  38. }
  39. functionend(){
  40. //echo'end';
  41. }
  42. //session清理
  43. functionclean_session(){
  44. session_unset();
  45. session_destroy();
  46. }
  47. }
  48. ?>
Action.PHP代码
  1. <?PHP
  2. classconsumptionextendsRApp{
  3. var$smarty_tpl_name;
  4. function__construct(){
  5. }
  6. functionend(){
  7. $this->display_smarty();
  8. }
  9. functiondefault_page(){
  10. $this->smarty_tpl_name='right.default_page.tpl';
  11. }
  12. functionrun(){
  13. $this->auto_load_methods();
  14. $this->end();
  15. }
  16. functionlist_consumption(){
  17. $this->smarty_tpl_name='consumptionall.list.tpl';
  18. //dosomethingquery
  19. }
  20. functionlist_product(){
  21. $this->smarty_tpl_name='product.list.tpl';
  22. //dosomethingquery
  23. }
  24. }
  25. ?>

单一入口应用程序的优势

单一入口应用程序的所有http请求都是通过index.PHP接收并转发到功能代码去的,所以在index.PHP里面就能完成许多实际工作,如autoload,init,cache,常用的公共方法等。

由于所有的http请求都由index.PHP接收,所以可以进行集中的安全性检查,如果不是单一入口,那么开发者就必须记得在每一个文件的开始加上安全性检查代码(当然,安全性检查可以写到另一个文件中,只需要include就可以了。)

与安全性检查类似。在入口里,我们还可以对url参数和post进行必要的检查和特殊字符过滤、记录日志、访问统计等等各种可以集中处理的任务。
这样就可以看出,由于这些工作都被集中到了index.PHP来完成,可以减轻我们维护其他功能代码的难度。

单一入口应用程序的缺点
任何事情都有两面性,单一入口应用程序也不例外。由于所有http请求都是针对index.PHP,所以程序的url看起来确实不那么美观,特别是对搜索引擎来说很不友好。要解决这个问题,可以采用url重写、PATHINFO等方式,但也可以在前台页面不使用单一入口方式,而是保持多个文件入口。或者两者混用。

对于单入口(访问网站必需首先通过某一文件,一般都是index.PHP来实现其它功能的项目)程序来说:常见的Url大都为:http://www.nostop.org/index.PHP?controller=posts&action=index
说实话这样的URL很难看,最重要的是搜索引擎不认它为正常的URL,这很可怕。如何实现一个好看的且与搜索引擎能攀上亲的URL呢。

看这个URL:http://www.nostop.org/index.PHP/posts/index/
很新奇的URL创意,这也是CakePHP框架的过程中体验出来的伪静态,此URL相对于彼URL来说:易记,美观,最主要的是搜索引擎虽不认它为老爸,起码不会把它划为黑名单。

解释一下上面的URL,"posts":一般称其为Controller(控制器),由它来决定加载哪个处理文件

"index":一般称其为Action(操作),由它来决定要进行什么操作。

所以/posts/index/顾名思义就是posts的主页了。如果后面需要传递参数可以直接加在Action后面。

如下面这个URL:http://www.nostop.org/index.PHP/posts/category/1/。列出posts的分类ID为1下的所有内容

PHP中的一些框架,zend framework,thinkPHP,fleaPHP,qeePHP,还有cakePHP等都是单入口模式,它们都采用了统一的入口,可以根据不同的需要,前台入口后台入口或者其他操作权限入口,这样的设计模式优点很明显,比如。权限控制,url重写,结合MVC清晰地目录结构。这些都是单入口模式所带来的便利,当然这样的也会带来执行效率的问。

原文链接:https://www.f2er.com/javaschema/287037.html

猜你在找的设计模式相关文章