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.   
  4. $action = $_GET ['action'] == '' ? 'index' : $_GET ['action'];  
  5. $operation = $_GET ['operation'] == '' ? 'index': $_GET ['operation'];  
  6. if(empty($action)){  
  7.     header('location:index.php?action=login');  
  8. }elseif(in_array($action, $admincp_actions_founder)) {  
  9.     include('files/'.$action.'.php');  
  10. }  
  11. ?>   

$action.php

Java代码   收藏代码
  1. <?php  
  2. if(!$operation) {  
  3. // do query from db and show page  
  4. } elseif($operation == 'list') {  
  5. // do query from db and show page  
  6. } elseif($operation == 'remove') {  
  7. // do query from db and show page  
  8. } elseif($operation == 'add') {  
  9. // do query from db and show page  
  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. class RApp {  
  3.     var $marty_tpl_name;  
  4.       
  5.     function __construct() {  
  6.     }  
  7.           
  8.     function &factory() {  
  9.         session_start ();  
  10.         if (isset ( $_GET ['act'] ) && preg_match ( '/^[a-zA-Z0-9]*$/', $_GET ['act'] ) && include_once 'Module/' . $_GET ['act'] . '.class.php') {  
  11.             $class_name = $_GET ['act'];  
  12.             $class = & new $class_name ();  
  13.             return $class;  
  14.         } else {  
  15.             $class = & new RApp ();  
  16.             return $class;  
  17.         }  
  18.     }  
  19.           
  20.     function auto_load_methods() {  
  21.         if (method_exists ( $this, $do )) {  
  22.             eval ( '$this->' . $do . '();' );  
  23.         } else {  
  24.             eval ( '$this->default_page();' );  
  25.         }  
  26.     }  
  27.       
  28.     //首页·  
  29.     function run() {  
  30.         //logout  
  31.         if (@$_GET ['logout'] == 1) {  
  32.             $this->clean_session ();  
  33.             header ( 'Location: index.php?act=login' );  
  34.         } elseif ($_SESSION ['uid']) {  
  35.             header ( 'Location:index.php?act=index&do=index' );  
  36.         } else {  
  37.             header ( 'Location: ?act=login' );  
  38.         }  
  39.     }  
  40.       
  41.     function display_smarty() {  
  42.         $this->smarty->display ( $this->smarty_tpl_name );  
  43.     }  
  44.       
  45.     function end() {  
  46.         //echo 'end';  
  47.     }  
  48.       
  49.     //session清理  
  50.     function clean_session() {  
  51.         session_unset ();  
  52.         session_destroy ();  
  53.     }  
  54. }  
  55. ?>  

 

Action.php代码   收藏代码
  1. <?php  
  2. class consumption extends RApp {  
  3.     var $smarty_tpl_name;  
  4.   
  5.     function __construct() {  
  6.     }  
  7.   
  8.     function end() {  
  9.         $this->display_smarty();  
  10.     }  
  11.   
  12.     function default_page() {  
  13.         $this->smarty_tpl_name='right.default_page.tpl';  
  14.     }  
  15.   
  16.     function run() {  
  17.         $this->auto_load_methods();  
  18.         $this->end();  
  19.     }  
  20.   
  21.     function list_consumption() {  
  22.         $this->smarty_tpl_name='consumptionall.list.tpl';  
  23.         //do something query  
  24.     }  
  25.   
  26.     function list_product() {  
  27.         $this->smarty_tpl_name='product.list.tpl';  
  28.         //do something query  
  29.     }  
  30. }  
  31. ?>  

单一入口应用程序的优势

单一入口应用程序的所有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清晰地目录结构。这些都是单入口模式所带来的便利,当然这样的也会带来执行效率的问。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值