PHP实现简易的MVC框架

article/2025/9/13 2:40:10

目录

  • 一、前言
  • 二、哪些框架使用到了mvc架构?
  • 三、框架结构简介
  • 四、框架实现第一步(解析路由)
    • 4.1 写入口文件
    • 4.2 定义Core核心类
  • 五、框架实现第二步(MVC的实现)
    • 5.1 控制器的实现
    • 5.2 视图的实现
    • 5.3 模型的实现
  • 六、总结

一、前言

MVC的全名是Model View Controller,是一种使用模型-视图-控制器设计和创建web应用程序的模式,是一种设计典范。

其中:

  • Model(模型):是应用程序中用于处理应用程序数据逻辑的部分,通常负责与数据库直接进行 curd 的交互。

  • View(视图):是应用程序处理数据显示的部分,通过将处理好的数据进行渲染。

  • Controller(控制器):是应用程序中处理用户交互的部分,通常用于处理数据逻辑的分发,并相应的反送给视图和控制器。

优点:

  • 低耦合
  • 重用性高
  • 部署快,生命周期成本低
  • 可维护性高

缺点:

  • 增加了系统结构和实现的复杂性
  • 视图与控制器间的过于紧密的连接

二、哪些框架使用到了mvc架构?

目前现在php主流的框架都已经用到了mvc架构,例如:

thinkPHPLaravelYii 都有mvc的架构。

三、框架结构简介

在这里插入图片描述
其中:

  • app目录:用来存放视图控制器模型等。
  • config目录:用来存放框架的一些公共配置文件。
  • core目录:用来存放一些基类文件,例如:控制器基类、模型基类、视图基类、request请求基类、db链式操作基类等。
  • static目录:用来存放一些静态资源,例如:图片、html视图文件、js、cs文件等。
  • index.php:整个框架的入口文件,进行分发启动。

四、框架实现第一步(解析路由)

解析路由为什么是第一步呢?

只有成功解析路由以后,访问到了某个类中的某个方法才可以使用MVC,因为解析路由也是框架实现的最基础的一部分,解析路由也少不了PHP的自动加载机制

目前的php的自动加载机制可以分为两大机制,composer自动加载机制和手动实现自动加载机制,该简易框架通过手动实现自动机制来完成。

4.1 写入口文件

index.php

<?php
//定义应用目录
const APP_PATH = __DIR__ . '/';//加载框架核心文件
require(APP_PATH . 'core/Core.php');//实例化框架类并运行
(new core\Core())->run();

代码详解:

第一步,定义了常量用来定义应用目录,后期可能会在某个地方就会用到。
第二步,加载框架核心文件 Core.php ,主要的核心逻辑也都集中在这个文件中。
第三步,实例化该类,并调用该类的run方法。

4.2 定义Core核心类

Core.php

<?php
namespace core;class Core
{public function run(){spl_autoload_register(array($this, 'loadClass'));$this->route();}public function route(){$url = $_SERVER['REQUEST_URI'];$position = strpos($url, '?');$url = $position === false ? $url : substr($url, 0, $position);$url = trim($url, '/');if ($url){//走URL指定控制器$urlArray = explode('/', $url);$controllerName = ucfirst($urlArray[count($urlArray)-2]);$actionName = $urlArray[1];}else{//走默认控制器$controllerName = 'Index';$actionName = 'index';}$versionUrlArr = explode('/',$url);$versionUrlArr = array_slice($versionUrlArr,0,-2);$versionStr = implode('\\',$versionUrlArr);if (empty($versionStr)){$versionStr = $versionStr;}else{$versionStr = $versionStr.'\\';}$controller = 'app\\controllers\\'.$versionStr. $controllerName . 'Controller';if (!class_exists($controller)) {exit($controller . '控制器不存在');}if (!method_exists($controller, $actionName)) {exit($actionName . '方法不存在');}$dispatch = new $controller($controllerName, $actionName);$dispatch->$actionName();}public function loadClass($className){$className = str_replace('\\','/', $className);$file = $className . '.php';if (file_exists($file)){require_once $file;}}
}

首先调用的是该类的 run 方法,run 方法主要负责调用运行框架所需要 的一些方法,首先注册了自动加载方法 loadClass,其后调用了的解析路由的方法(这儿是重点,这儿实现了地址栏上输入接口地址直接访问控制器)。

注意⚠️:路由的解析规则是由我们自己来进行定义的。

代码详解:

第一步:注册自动加载类,目的是为了路由解析、命名空间所使用。
第二步:调用路由解析方法,把地址栏上输入的 域名/控制器名/方法名 给解析出来,并进行调用。

经过一系列解析后,最终 new 类名,调用方法名,来实现了路由的成功解析,从而访问了某个类下面的某个方法。

$dispatch = new $controller($controllerName, $actionName);
$dispatch->$actionName();

例如,要访问app\controllers\StudentController.php文件下的 demo 方法:

<?php
namespace app\controllers;use core\base\Controller;class StudentController extends Controller
{public function demo(){echo '写代码的光头强';}
}

在这里插入图片描述

五、框架实现第二步(MVC的实现)

通过第一步已经完成了地址栏输入路径访问到某个控制器中了,下面就需要在控制器中进行 MVC 操作了。

5.1 控制器的实现

控制器本身是已经实现的,但是我们需要去继承一个控制器基类在里面实现一些操作,例如:注册一些全局异常类、注册一些请求类、控制器之间的互相调用等。

5.2 视图的实现

视图基类文件写到了 core/base/View.php 文件里:

<?php
namespace core\base;/*** 视图基类*/
class View
{protected $variables = array();protected $_controller;protected $_action;function __construct($controller, $action){$this->_controller = strtolower($controller);$this->_action = strtolower($action);}public function assign($name, $value){$this->variables[$name] = $value;}public function render(){try {extract($this->variables);$file = APP_PATH . 'app/views/' . $this->_controller . '/' . $this->_action . '.php';if (file_exists($file)){require_once $file;}else{require_once APP_PATH.'core/errorpage/404.html';}}catch (\Exception $e){echo $e->getMessage();}}
}

代码详解:

其中,视图功能有两大功能。

第一大功能:传值(assign)

我们一般传值都是通过

$this->assign('name','写代码的光头强');
$this->assign('sex','男');

这种方法进行传值。

在框架中实现的方法为:

public function assign($name, $value)
{$this->variables[$name] = $value;
}

很明显的可以看出,将所有的键值对放到了一个数组中。

第二大功能:视图映射(render)

实现代码:

public function render()
{extract($this->variables);$file = APP_PATH . 'app/views/' . $this->_controller . '/' . $this->_action . '.php';if (file_exists($file)){require_once $file;}else{require_once APP_PATH.'core/errorpage/404.html';}
}

接收到控制器名方法名,拼接到自定义视图解析规则地址上,直接引入即可。

5.3 模型的实现

实现模型的灵魂就是要控制器名作为表名来使用。

控制器中:

$data = ['name' => 'tom'];
$model = new StudentModel();
$model->addData($data);

自定义的模型中:

<?php
namespace app\models;use core\base\Model;
class StudentModel extends Model
{protected $table = 'student';public function addData($data){$this->add($data);}
}

模型基类:

<?php
namespace core\base;use core\db\Orm;class Model extends Orm
{protected $table;public function __construct(){echo $this->table;}public function add($data){//处理添加逻辑}
}

在模型基类中我们可以自定义orm来完成与数据库的交互操作。

六、总结

以上只是介绍了最简易的MVC实现案例,实现MVC框架没有固定的实现方法,根据框架特色和语言特点以及自己的需求进行实现即可。

附:源码已上传至gitee,点击进入我的gitee


http://chatgpt.dhexx.cn/article/uc8exXJV.shtml

相关文章

Unity MVC框架之见解

Unity MVC框架之见解 MVC框架认识构架图案例无框架&#xff0c;普通逻辑代码脚本主UI脚本角色UI脚本摄像机显示脚本脚本的放置 MVC框架的运用Model脚本View脚本主界面的View脚本角色View脚本 Controller脚本主界面的Controller脚本角色Controller脚本 控制主界面的显示脚本脚本…

asp.net mvc框架

#mvc基础 &#xff08;model view controller&#xff09; 是模型—视图—控制器的缩写&#xff0c;一种用于开发web应用程序的软件架构模式&#xff0c;用一种业务逻辑、数据、界面显示分离的方法组织代码&#xff0c;将业务逻辑聚集到一个部件里面&#xff0c;在改进和个性化…

MVC框架简介

MVC的全拼为Model-View-Controller&#xff0c;最早由TrygveReenskaug在1978年提出&#xff0c;是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件设计模式&#xff0c;是为了将传统的输入(input)、处理(processing)、输出(output)任务运用到…

PHP笔记-自定义MVC框架

膜拜 膜拜下黑马大佬程序员的项目&#xff0c;学习到了这样的手写MVC框架的方式&#xff0c;受益匪浅&#xff0c;感觉自己在C/C和Java方面&#xff0c;还有许多要学习的地方&#xff0c;看看能不能抄下这个php自己撸一个C/C的MVC框架。 下面记录下PHP自定义MVC框架。 项目结…

搭建一个简单的MVC框架

背景 为何要用MVC框架&#xff1f;首先我们知道不用框架的话&#xff0c;在javaweb项目中每个请求都要写一个servlet&#xff0c;并且要在web.xml中对每个servlet类的映射作配置&#xff0c;不方便开发&#xff0c;因此引入MVC框架。 工作原理 简单的说MVC框架就是为了简化开…

Android MVC框架

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、MVC是什么&#xff1f;二、写个简单的例子1.bean2.callback3.interfaces4.model5.ui 优缺点总结 前言 提示&#xff1a;很多教程讲解框架感觉都像说天书一…

MVC框架之SpringMVC

简介 Spring MVC 是 Spring 给我们提供的⼀个⽤于简化 Web 开发的框架。在说Spring MVC前&#xff0c;我们需要了解下什么是MVC架构以及三层架构&#xff1f; 1 MVC 体系结构 三层架构 在 JavaEE 开发中&#xff0c;⼏乎全都是基于 B/S 架构的开发。那么在 B/S 架构中&…

MVC架构简单介绍

一&#xff1a;MVC架构简介 MVC是Model&#xff08;模型&#xff09;view&#xff08;视图层&#xff09;controller&#xff08;控制器&#xff09;这三者的缩写。 在百度百科中是这样介绍的&#xff1a;MVC强制性地使应用程序的输入、处理和输出分开。使用MVC应用程序被分成…

MVC框架详解(资源整理)

一、什么是MVC&#xff1f; MVC是三个单词的首字母缩写&#xff0c;它们是Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;和Controller&#xff08;控制&#xff09;。 1、视图 视图(View)代表用户交互界面&#xff0c;对于Web应用来说&#x…

MVC框架

MVC框架 MVC框架——一个理论框架&#xff01;&#xff01;&#xff01;前言——必看1 经典MVC框架2 经典mvc模式就是jspservletJavaBean3 JavaBean4 实际MVC框架应用5 总结 MVC框架——一个理论框架&#xff01;&#xff01;&#xff01; 注意&#xff1a;mvc框架只是理论上的…

dojo介绍

dojo是目前最为强大的js框架&#xff0c;包括ajax,browser,event,widget等跨浏览器API&#xff0c;用dojo写Web OS可谓非常方便。 dojo现在已经4.0了&#xff0c;我自己其实不怎么用dojo&#xff0c;毕竟dojo强大的地方在于界面和特效的封装&#xff0c;可以让开发者快速构建一…

(2)Dojo学习之模块化

引言Dojo之模块化 1定义模块2调用模块3解释dojoConfig的全局变量 总结 1本篇博客代码下载地址Dojo模块化 1.引言 在本篇博客中主要讲解一下如何在dojo中使用模块&#xff0c;如何自定义自己的模块等等&#xff0c;在使用dojo编程的时候&#xff0c;大家一定要转变自己的思想&a…

Dojo 1.6 官方教程: 创建自定义Dojo小部件(Widget)

在这个教程中&#xff0c;我们将会演示如何利用Dojo 和Dijit框架来创建自定义的小部件。 主要会使用到dijit._Widget 和dijit._Templated 基类和mixin。 对dijit框架的基础知识&#xff0c;可以参看前两篇教程 难度&#xff1a;中等 适用Dojo版本&#xff1a; 1.6 作者&#xf…

(3)Dojo学习之Class

引言dojo中的类 1创建一个简单的类2类和模块结合使用3关于类的继承 需求 1需求一2需求二很重要21代码实现22程序出错23程序运行3 需求三 再次介绍require加载模块总结 1本博客代码的下载地址dojo_class 1.引言 说到面向对象&#xff0c;我们就不得不提一下类&#xff0c;在原生…

探索dojo/json

难度&#xff1a;中等 Dojo版本&#xff1a;1.7 原作者&#xff1a;Kris Zyp 译者&#xff1a;Oliver (zhuxw1984gmail.com) 原文链接&#xff1a;http://www.sitepen.com/blog/2012/09/21/exploring-dojojson/ &#xff08;年初翻译过Kris Zyp的另一篇介绍dojo/json的文章&…

dojo是什么?

现在Web端vue、React、Angular大行其道&#xff0c;安卓端js也有React Native等&#xff0c;那么学习dojo有什么意义呢&#xff1f; 有些老的项目还是用的dojo。。。。例如arcgis javascript api等等 https://dojotoolkit.org/documentation/tutorials/1.10/hello_dojo/ 为什…

Dojo入门篇

Dojo是一个JavaScript实现的开源DHTML工具包&#xff0c;Dojo最初的目标是解决开发HTML应用程序中遇到的一些长期存在的问题&#xff0c;然而现在Dojo已经成为了开发RIA应用程序的利器。 Dojo让Web页面具有动态能力&#xff0c;我们可以在其他支持JavaScript的环境中使用Dojo。…

dojo中的类

使用arcgis api for js 4.*进行地图的web前端开发&#xff0c;就不得不与dojo打交道。dojo是一个框架&#xff0c;自成体系&#xff0c;比如它对类的支持&#xff0c;有自己的一套。众所周知&#xff0c;js不是面向对象语言&#xff0c;没有类这一说&#xff0c;都是用函数来模…

dojo学习教程

Dojo 作为最著名的 Ajax 开源项目之一&#xff0c;不仅让 Web 程序员可以免费获得和使用其框架进行 Web 应用的开发&#xff0c;更吸引了大量的开发者对其不断的扩充&#xff0c;开发新的组件。DojoX 就是在这样的开发社区中产生的。DojoX 是一组基于 dojo 的开源项目的集合&am…

Dojo与jQuery综合比较分析

最近Dojo和jQuery双双发布了最新的1.8版本,有着相同版本号的两个Javascript库也有许多核心的相同之处:相同的资源加载机制AMD、相同的选择器 引擎Sizzle等。作为业界知名的Javascript库,Dojo和jQuery在各自领域有着为数众多的拥护者。不过正所谓一把钥匙开一把锁,对一个项目…