文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何用PHP实现简易的MVC框架

2023-06-30 13:33

关注

这篇文章主要介绍了如何用PHP实现简易的MVC框架的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何用PHP实现简易的MVC框架文章都会有所收获,下面我们一起来看看吧。

如何用PHP实现简易的MVC框架

一、前言

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

其中:

优点:

缺点:

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

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

thinkPHPLaravelYii 都有mvc的架构。

三、框架结构简介

如何用PHP实现简易的MVC框架
其中:

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

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

只有成功解析路由以后,访问到了某个类中的某个方法才可以使用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

<?phpnamespace 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 方法:

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

如何用PHP实现简易的MVC框架

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

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

5.1 控制器的实现

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

5.2 视图的实现

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

<?phpnamespace 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);

自定义的模型中:

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

模型基类:

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

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

关于“如何用PHP实现简易的MVC框架”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“如何用PHP实现简易的MVC框架”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯