实例详解怎么用PHP实现简易的MVC框架

本篇文章给大家带来了关于PHP的相关知识,其中主要介绍了关于怎么用PHP实现简易的MVC框架的相关问题,包括了框架结构简介以及框架实现等内容,下面一起来看一下,希望对大家有帮助。 …

本篇文章给大家带来了关于PHP的相关知识,其中主要介绍了关于怎么用PHP实现简易的MVC框架的相关问题,包括了框架结构简介以及框架实现等内容,下面一起来看一下,希望对大家有帮助。

实例详解怎么用PHP实现简易的MVC框架

一、前言

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

其中:

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

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

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

优点:

低耦合

重用性高

部署快,生命周期成本低

可维护性高

缺点:

增加了系统结构和实现的复杂性

视图与控制器间的过于紧密的连接

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

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

thinkPHP、Laravel、Yii都有mvc的架构。

三、框架结构简介实例详解怎么用PHP实现简易的MVC框架

其中:

app目录:用来存放视图控制器模型等。

config目录:用来存放框架的一些公共配置文件。

core目录:用来存放一些基类文件,例如:控制器基类、模型基类、视图基类、request请求基类、db链式操作基类等。

static目录:用来存放一些静态资源,例如:图片、html视图文件、js、cs文件等。

index.php:整个框架的入口文件,进行分发启动。

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

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

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

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

4.1 写入口文件

index.php:

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

代码详解:

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

4.2 定义Core核心类

Core.php:

<?phpnamespacecore;classCore{publicfunctionrun(){spl_autoload_register(array($this,'loadClass'));$this->route();}publicfunctionroute(){$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();}publicfunctionloadClass($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 方法:

<?phpnamespaceapp\controllers;usecore\base\Controller;classStudentControllerextendsController{publicfunctiondemo(){echo'写代码的光头强';}}

实例详解怎么用PHP实现简易的MVC框架

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

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

5.1 控制器的实现

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

5.2 视图的实现

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

<?phpnamespacecore\base;/***视图基类*/classView{protected$variables=array();protected$_controller;protected$_action;function__construct($controller,$action){$this->_controller=strtolower($controller);$this->_action=strtolower($action);}publicfunctionassign($name,$value){$this->variables[$name]=$value;}publicfunctionrender(){try{extract($this->variables);$file=APP_PATH.'app/views/'.$this->_controller.'/'.$this->_action.'.php';if(file_exists($file)){require_once$file;}else{require_onceAPP_PATH.'core/errorpage/404.html';}}catch(\Exception$e){echo$e->getMessage();}}}

代码详解:

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

第一大功能:传值(assign)。

我们一般传值都是通过

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

这种方法进行传值。

在框架中实现的方法为:

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

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

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

实现代码:

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

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

5.3 模型的实现

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

控制器中:

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

自定义的模型中:

<?phpnamespaceapp\models;usecore\base\Model;classStudentModelextendsModel{protected$table='student';publicfunctionaddData($data){$this->add($data);}}

模型基类:

<?phpnamespacecore\base;usecore\db\Orm;classModelextendsOrm{protected$table;publicfunction__construct(){echo$this->table;}publicfunctionadd($data){//处理添加逻辑}}

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

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

产品猿社区致力收录更多优质的商业产品,给服务商以及软件采购客户提供更多优质的软件产品,帮助开发者变现来实现多方共赢;

日常运营的过程中我们难免会遇到各种版权纠纷等问题,如果您在社区内发现有您的产品未经您授权而被用户提供下载或使用,您可按照我们投诉流程处理,点我投诉

本文来自用户发布投稿,不代表产品猿立场 ;若对此文有疑问或内容有严重错误,可联系平台客服反馈;

部分产品是用户投稿,可能本文没有提供官方下下载地址或教程,若您看到的内容没有下载入口,您可以在我们产品园商城搜索看开发者是否有发布商品;若您是开发者,也诚邀您入驻商城平台发布的产品,地址:点我进入

如若转载,请注明出处:https://www.chanpinyuan.cn/28562.html;
(0)
上一篇 2022年12月3日 下午4:18
下一篇 2022年12月3日 下午4:18

相关推荐

发表回复

登录后才能评论
分享本页
返回顶部