`
hudeyong926
  • 浏览: 2035062 次
  • 来自: 武汉
社区版块
存档分类
最新评论

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参数调用不同的代码文件,从而满足单一入口实现对应的不同的功能。

<?php
$admincp_actions_founder = array ('templates', 'db', 'founder', 'postsplit', 'threadsplit');

$action = $_GET ['action'] == '' ? 'index' : $_GET ['action'];
$operation = $_GET ['operation'] == '' ? 'index': $_GET ['operation'];
if(empty($action)){
	header('location:index.php?action=login');
}elseif(in_array($action, $admincp_actions_founder)) {
	include('files/'.$action.'.php');
}
?> 

$action.php

<?php
if(!$operation) {
// do query from db and show page
} elseif($operation == 'list') {
// do query from db and show page
} elseif($operation == 'remove') {
// do query from db and show page
} elseif($operation == 'add') {
// do query from db and show page
}
?>

面向对象的调用方法

<?php  
class autoloader {  
    public static $loader;  
      
    public static function init() {  
        if (self::$loader == NULL)  
            self::$loader = new self ();  
          
        return self::$loader;  
    }  
      
    public function __construct() {  
        spl_autoload_register ( array ($this, 'model' ) );  
        spl_autoload_register ( array ($this, 'helper' ) );  
        spl_autoload_register ( array ($this, 'controller' ) );  
        spl_autoload_register ( array ($this, 'library' ) );  
    }  
      
    public function library($class) {  
        set_include_path ( get_include_path () . PATH_SEPARATOR . '/lib/' );  
        spl_autoload_extensions ( '.library.php' );  
        spl_autoload ( $class );  
    }  
      
    public function controller($class) {  
        $class = preg_replace ( '/_controller$/ui', '', $class );  
          
        set_include_path ( get_include_path () . PATH_SEPARATOR . '/controller/' );  
        spl_autoload_extensions ( '.controller.php' );  
        spl_autoload ( $class );  
    }  
      
    public function model($class) {  
        $class = preg_replace ( '/_model$/ui', '', $class );  
          
        set_include_path ( get_include_path () . PATH_SEPARATOR . '/model/' );  
        spl_autoload_extensions ( '.model.php' );  
        spl_autoload ( $class );  
    }  
      
    public function helper($class) {  
        $class = preg_replace ( '/_helper$/ui', '', $class );  
          
        set_include_path ( get_include_path () . PATH_SEPARATOR . '/helper/' );  
        spl_autoload_extensions ( '.helper.php' );  
        spl_autoload ( $class );  
    }  
 
}  
 
//call  
autoloader::init ();  
?>  

单一入口应用程序的优势

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

分享到:
评论

相关推荐

    PureMVC简单例子

    4. **多态观察者(Multiton)**:PureMVC引入了多态观察者模式,`Facade`是这一模式的实现,它为整个应用提供单一的入口点,管理所有其他组件,并确保它们之间正确通信。 在“HelloPureMVC”这个例子中,你会看到...

    pureMVC简单例子

    - **Facade**:PureMVC的门面(Facade)是整个框架的单一接口,它负责注册和协调所有其他组件,确保它们之间的通信正常。 - **Notifications**:可能有一个`Constants`或`Notification`类,定义了所有在系统中传递的...

    pureMVC倒计时

    5. **Facade**:Facade是PureMVC的核心,它是对整个系统的一个单一入口点。在倒计时应用中,`ClockFacade`可能会初始化所有的Proxy、Command和Mediator,以及设置它们之间的关联。 现在,让我们详细讨论`clock`...

    puremvc基础教程

    4. **Facade(门面)** - Facade是PureMVC的核心,它作为单一入口点,管理和协调所有的Proxy、Mediator和Command。开发者通过与Facade交互,来启动应用程序、注册组件、发送通知等。Facade确保了MVC结构的整洁和模块...

    zentaophp框架 v3.0

    ZenTaoPHP框架的主要功能如下:一、单一入口模式单一入口是现在比较流行的开发方式。好处在于可以有一个集中的控制。或者讲框架一个比较基本的东西也是单一入口吧。现在ZenTaoPHP框架支持web方式和命令行方式的两种...

    php实现简单的MVC框架实例

    MVC框架通常采用单一入口文件设计。这意味着所有的请求都将通过一个入口文件进行处理,这有利于统一管理应用的启动和请求流程控制。在PHP中,这通常是一个名为`index.php`的文件。例如,在本文提供的实例中,`index....

    zentaophp框架 v1.0 beta1

    ZenTaoPHP框架的主要功能如下:一、单一入口模式单一入口是现在比较流行的开发方式。好处在于可以有一个集中的控制。或者讲框架一个比较基本的东西也是单一入口吧。现在ZenTaoPHP框架支持web方式和命令行方式的两种...

    thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】

    ThinkPHP5.0支持单一模块架构设计,这意味着如果应用下只有一个模块,你可以省略这个模块的子目录,并在应用配置文件中进行相应的调整。每个模块下面通常有多个控制器,这些控制器负责处理不同类型的请求。 ...

    《HongCMS开发者手册》二次开发指南.docx

    2. `index.php`:作为系统单一入口点,处理所有前台页面请求。 3. `robots.txt`:列出禁止搜索引擎索引的目录,以减轻网站负担。 4. `Admin`目录:包含后台管理文件,包括入口文件、控制器和模型。 5. `Cache`目录:...

    spring-rest:一个简单的例子,Spring启动,微服务restfull

    在IT行业中,Spring框架是Java开发者的首选工具之一,尤其在构建RESTful Web服务时。本文将深入探讨Spring REST和Spring Boot如何协同工作,创建一个简单的微服务应用。我们将基于提供的"spring-rest"项目,这是一个...

    云计算英文版课件:Chapter 3 Accessing the Cloud.pdf

    AJAX不是一种单一的技术,而是一种利用JavaScript进行异步数据交换和页面更新的技术,它允许网页在不重新加载整个页面的情况下与服务器交换数据并更新部分网页内容。这极大地提升了用户体验。而Python Django则是一...

    kohana3.3.1框架教程 -

    这个框架强调面向对象编程的严谨性,支持自动加载、重载、接口、抽象类和单一模式等特性,确保了代码的组织性和可维护性。 在 Kohana 中,全局数据如 GET、POST、COOKIE 和 SESSION 可以方便地访问,同时框架会对...

    ChineseFramework大型WEB应用框架程序

    统一程序入口、逻辑实现分离 符合MVC模式。 10.合理的业务逻辑设计, 包括标准的添加,修改, 删除, 取一条数据, 取列表, 计算总数,transData (对返回给UI层的数据进行转换)和untransData(对入库数据根据...

    23种Java设计模式和15种J2EE设计模式.pdf

    6. **前端控制器模式**:提供一个单一的入口点来处理所有的请求。 7. **远程代理模式**:为远程对象提供本地代理,以便于远程方法调用。 以上列举的Java设计模式和J2EE设计模式仅为冰山一角,每种模式都有其特定的...

    理解 Zend 框架(IBM经典中文教程)

    然而,随着项目规模的增长和技术需求的变化,单一的脚本语言难以满足复杂的业务逻辑处理。因此,框架的概念应运而生,旨在通过封装常用的功能和设计模式,帮助开发者快速构建高质量的应用。 Zend 框架便是这样一款...

    iphon开发秘笈

    - **模型—视图—控制器**(MVC):这是iOS应用程序设计中最常用的一种模式,它将应用程序逻辑分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)。 **1.7 构建iPhone应用程序主干** 构建应用...

Global site tag (gtag.js) - Google Analytics