开发者社区> 航空母舰> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

MVC前提之单一入口+例子

简介:
+关注继续查看

单一入口概述 set_include_path
单一入口的应用程序就是说用一个文件处理所有的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. ?>  

面向对象的调用方法

Action.php代码  收藏代码
  1. <?php    
  2. class autoloader {    
  3.     public static $loader;    
  4.         
  5.     public static function init() {    
  6.         if (self::$loader == NULL)    
  7.             self::$loader = new self ();    
  8.             
  9.         return self::$loader;    
  10.     }    
  11.         
  12.     public function __construct() {    
  13.         spl_autoload_register ( array ($this, 'model' ) );    
  14.         spl_autoload_register ( array ($this, 'helper' ) );    
  15.         spl_autoload_register ( array ($this, 'controller' ) );    
  16.         spl_autoload_register ( array ($this, 'library' ) );    
  17.     }    
  18.         
  19.     public function library($class) {    
  20.         set_include_path ( get_include_path () . PATH_SEPARATOR . '/lib/' );    
  21.         spl_autoload_extensions ( '.library.php' );    
  22.         spl_autoload ( $class );    
  23.     }    
  24.         
  25.     public function controller($class) {    
  26.         $class = preg_replace ( '/_controller$/ui''', $class );    
  27.             
  28.         set_include_path ( get_include_path () . PATH_SEPARATOR . '/controller/' );    
  29.         spl_autoload_extensions ( '.controller.php' );    
  30.         spl_autoload ( $class );    
  31.     }    
  32.         
  33.     public function model($class) {    
  34.         $class = preg_replace ( '/_model$/ui''', $class );    
  35.             
  36.         set_include_path ( get_include_path () . PATH_SEPARATOR . '/model/' );    
  37.         spl_autoload_extensions ( '.model.php' );    
  38.         spl_autoload ( $class );    
  39.     }    
  40.         
  41.     public function helper($class) {    
  42.         $class = preg_replace ( '/_helper$/ui''', $class );    
  43.             
  44.         set_include_path ( get_include_path () . PATH_SEPARATOR . '/helper/' );    
  45.         spl_autoload_extensions ( '.helper.php' );    
  46.         spl_autoload ( $class );    
  47.     }    
  48.    
  49. }    
  50.    
  51. //call    
  52. autoloader::init ();    
  53. ?>    

单一入口应用程序的优势

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
springMVC知识重温
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合
397 0
MVC
在MVC结构中,模型(Model)代表应用程序的数据(data)和用于控制访问和修改这些数据的业务规则(business rule)。通常模型被用来作为对现实世界中一个处理过程的软件近似,当定义一个模型时,可以采用一般的简单的建模技术。
908 0
MVC的基类
设计一个验证用户身份是否登陆的基类BaseController /// /// 所有需要进行登录控制的控制器基类 /// public class BaseController : Controller { /// ...
639 0
初识MVC
        mvc,英文名叫Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
1080 0
第一章 初识MVC4
1、MVC模式 Mvc将应用程序分离为三个部分: Model:是一组类,用来描述被处理的数据,同时也定义这些数据如何被变更和操作的业务规则。与数据访问层非常类似。 View:是一种动态生成HTML的模板,定义程序的用户界面如何显示。
913 0
mvc
Model、View、Controller 一、Model Proxy-->数据端(与远程服务器通信) 二、view Mediator--->操作视图组件(添加事件监听器,发送或接收Notification) 三、Controller Command映射(获取Proxy,通过收发Notification操作别的Command) 框架以外要做的:编写具体的Command,Mediator,Proxy。
528 0
+关注
514
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载