首页 php教程 php手册 PHP实现MVC开发: 一个简单的MVC

PHP实现MVC开发: 一个简单的MVC

Jun 10, 2016 pm 03:06 PM
mvc php 代码 实现 开源 简单 编程 编程语言 软件开发

今天研究了下PHP MVC结构,所以决定自己写个简单的MVC,以待以后有空再丰富。
至于什么MVC结构,其实就是三个Model,Contraller,View单词的简称,,Model,主要任务就是把数据库或者其他文件系统的数据按 照我们需要的方式读取出来。View,主要负责页面的,把数据以html的形式显示给用户。Controller,主要负责业务逻辑,根据用户的 Request进行请求的分配,比如说显示登陆界面,就需要调用一个控制器userController的方法loginAction来显示。
下面我们用PHP来创建一个简单的MVC结构系统。
首先创建单点入口,即bootstrap文件index.php,作为整个MVC系统的唯一入口。什么是单点入口呢?所谓单点入口就是整个应用程序只有一 个入口,所有的实现都通过这个入口来转发。为什么要做到单点入口呢?单点入口有几大好处:第一、一些系统全局处理的变量,类,方法都可以在这里进行处理。 比如说你要对数据进行初步的过滤,你要模拟session处理,你要定义一些全局变量,甚至你要注册一些对象或者变量到注册器里面。第二、程序的架构更加 清晰明了。当然好处还有很多的。:)

<?php <br>include("core/ini.php");<br>initializer::initialize();<br>$router = loader::load("router");<br>dispatcher::dispatch($router);<br>
登录后复制

这个文件就只有4句,我们现在一句句来分析。
include(”core/ini.php”);

我们来看core/ini.php

<?php <br>set_include_path(get_include_path() . PATH_SEPARATOR . "core/main");<br>//set_include_path — Sets the include_path configuration option<br>function __autoload($object){<br>  require_once("{$object}.php");<br>}<br>
登录后复制

这个文件首先设置了include_path,也就是我们如果要找包含的文件,告诉系统在这个目录下查找。其实我们定义__autoload()方法,这个方法是在PHP5增加的,就是当我们实例化一个函数的时候,如果本文件没有,就会自动去加载文件。官方的解释是:
Many developers writing object-oriented applications create one PHP source file per-class definition. One of the biggest annoyances is having to write a long list of needed includes at the beginning of each script (one for each class).

In PHP 5, this is no longer necessary. You may define an __autoload function which is automatically called in case you are trying to use a class/interface which hasn’t been defined yet. By calling this function the scripting engine is given a last chance to load the class before PHP fails with an error.

接下来我们看下面一句
initializer::initialize();
这就话就是调用initializer类的一个静态函数initialize,因为我们在ini.php,设置了include_path,以及定义了__autoload,所以程序会自动在core/main目录查找initializer.php.
initializer.php文件如下:

<?php <br>class initializer<br>{<br>	public static function initialize()	{<br>		set_include_path(get_include_path().PATH_SEPARATOR . "core/main");<br>		set_include_path(get_include_path().PATH_SEPARATOR . "core/main/cache");<br>		set_include_path(get_include_path().PATH_SEPARATOR . "core/helpers");<br>		set_include_path(get_include_path().PATH_SEPARATOR . "core/libraries");<br>		set_include_path(get_include_path().PATH_SEPARATOR . "app/controllers");<br>		set_include_path(get_include_path().PATH_SEPARATOR."app/models");<br>		set_include_path(get_include_path().PATH_SEPARATOR."app/views");<br>		//include_once("core/config/config.php");<br>	}<br>}<br>?><br>
登录后复制

这个函数很简单,就只定义了一个静态函数,initialize函数,这个函数就是设置include_path,这样,以后如果包含文件,或者__autoload,就会去这些目录下查找。

OK,我们继续,看第三句
$router = loader::load(”router”);

这句话也很简单,就是加载loader函数的静态函数load,下面我们来loader.php

<?php <br>class loader<br>{<br>  private static $loaded = array();<br>  public static function load($object){<br>    $valid = array(  "library",<br>	                    "view",<br>                            "model",<br>                            "helper",<br>                            "router",<br>                            "config",<br>                            "hook",<br>                            "cache",<br>                            "db");<br>    if (!in_array($object,$valid)){<br> 	  throw new Exception("Not a valid object '{$object}' to load");<br>    }<br>    if (empty(self::$loaded[$object])){<br>      self::$loaded[$object]= new $object();<br>    }<br>    return self::$loaded[$object];<br>  }<br>}<br>
登录后复制

这个文件就是去加载对象,因为以后我们可能会丰富这个MVC系统,会有model,helper,config等等的组件。如果加载的组件不在有效 的范围内,我们抛出一个异常。如果在的话,我们实例化一个对象,其实这里用了单件设计模式。也就是这个对象其实就只能是一个实例化对象,如果没有实例化, 创建一个,如果存在的,则不实例化。

好,因为我们现在要加载的是router组件,所以我们看下router.php文件,这个文件的作用就是映射URL,对URL进行解析。
router.php

<?php <br>class router<br>{<br>  private $route;<br>  private $controller;<br>  private $action;<br>  private $params;<br>  public function __construct()<br>  {<br>    $path = array_keys($_GET);<br>    if (!isset($path[0])){<br>      if (!empty($default_controller))<br>           $path[0] = $default_controller;<br>      else<br>           $path[0] = "index";<br>    }<br>    $route= $path[0];<br>    $this->route = $route;<br>    $routeParts = split( "/",$route);<br>    $this->controller=$routeParts[0];<br>    $this->action=isset($routeParts[1])? $routeParts[1]:"base";<br>    array_shift($routeParts);<br>    array_shift($routeParts);<br>    $this->params=$routeParts;<br>  }<br>  public function getAction() {<br>    if (empty($this->action)) $this->action="main";<br>    return $this->action;<br>  }<br>  public function getController()  {<br>    return $this->controller;<br>  }<br>  public function getParams()  {<br>    return $this->params;<br>  }<br>}<br>
登录后复制

我们可以看到,首先我们是拿到$_GET,用户Request的URL,然后从URL里我们解析出Controller和Action,以及Params
比如我们的地址是http://www.tinoweb.cn/user/profile/id/3
那么从上面的地址,我们可以拿到controller是user,action似乎profile,参数是id以及3

OK我们看最后一句,就是
dispatcher::dispatch($router);

这句话的意思很明了,就是拿到URL解析的结果,然后通过dispatcher来分发controlloer及action来Response给用户
好,我们来看下dispatcher.php文件

<br>class dispatcher<br>{<br>  public static function dispatch($router)<br>  {<br>    global $app;<br>    ob_start();<br>    $start = microtime(true);<br>    $controller = $router->getController();<br>    $action = $router->getAction();<br>    $params = $router->getParams();<br>    $controllerfile = "app/controllers/{$controller}.php";<br>    if (file_exists($controllerfile)){<br>      require_once($controllerfile);<br>      $app = new $controller();<br>      $app->setParams($params);<br>      $app->$action();<br>      if (isset($start)) echo "<br><br>Tota1l time for dispatching is : ".(microtime(true)-$start)." seconds.<br><br>";<br>      $output = ob_get_clean();<br>      echo $output;<br>     }else{<br>	throw new Exception("Controller not found");<br>     }<br>   }<br>}<br>
登录后复制

这个类很明显,就是拿到$router来,寻找文件中的controller和action来回应用户的请求。

OK,我们一个简单的,MVC结构,就这样,当然这里还不能算是一个很完整的MVC,因为这里还没有涉及到View和Model,有空我再这里丰富。

我们来写个Controller文件来测试下上面的这个系统。

我们在app/controllers/下创建一个user.php文件

//user.php<br><?php <br>class user<br>{<br>  function base()<br>  {<br>  }<br>  public function login()<br>  {<br>    echo 'login html page';<br>  }<br>  public function register()<br>  {<br>    echo 'register html page';<br>  }<br>  public function setParams($params){<br>	var_dump($params);<br>  }<br>}<br>
登录后复制

然后你可以在浏览器中输入http://localhost/index.php?user/register 或者 http://localhost/index.php?user/login来测试下。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

您如何在PHP中解析和处理HTML/XML? 您如何在PHP中解析和处理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

php程序在字符串中计数元音 php程序在字符串中计数元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

我后悔之前不知道的 7 个 PHP 函数 我后悔之前不知道的 7 个 PHP 函数 Nov 13, 2024 am 09:42 AM

如果您是一位经验丰富的 PHP 开发人员,您可能会感觉您已经在那里并且已经完成了。您已经开发了大量的应用程序,调试了数百万行代码,并调整了一堆脚本来实现操作

编码的关键:为初学者释放 Python 的力量 编码的关键:为初学者释放 Python 的力量 Oct 11, 2024 pm 12:17 PM

Python通过其易学性和强大功能,是初学者的理想编程入门语言。其基础包括:变量:用于存储数据(数字、字符串、列表等)。数据类型:定义变量中数据的类型(整数、浮点数等)。运算符:用于数学运算和比较。控制流:控制代码执行流(条件语句、循环)。

使用 Python 解决问题:作为初学者,解锁强大的解决方案 使用 Python 解决问题:作为初学者,解锁强大的解决方案 Oct 11, 2024 pm 08:58 PM

Python 使初学者能够解决问题。其用户友好的语法、广泛的库以及变量、条件语句和循环等功能可实现高效的代码开发。从管理数据到控制程序流程和执行重复任务,Python 提供了

See all articles