加入收藏 | 设为首页 | 会员中心 | 我要投稿 揭阳站长网 (https://www.0663zz.cn/)- 机器学习、行业智能、决策智能、云计算、AI应用!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2022-08-10 11:24:06 所属栏目:PHP教程 来源:互联网
导读:一、前言 MVC的全名是Model View Controller,是一种使用模型-视图-控制器设计和创建web应用程序的模式,是一种设计典范。 其中: Model(模型):是应用程序中用于处理应用程序数据逻辑的部分,通常负责与数据库直接进行 curd 的交互。 View(视图):是应
  一、前言
  MVC的全名是Model View Controller,是一种使用模型-视图-控制器设计和创建web应用程序的模式,是一种设计典范。
 
  其中:
 
  Model(模型):是应用程序中用于处理应用程序数据逻辑的部分,通常负责与数据库直接进行 curd 的交互。
 
  View(视图):是应用程序处理数据显示的部分,通过将处理好的数据进行渲染。
 
  Controller(控制器):是应用程序中处理用户交互的部分,通常用于处理数据逻辑的分发,并相应的反送给视图和控制器。
 
  优点:
 
  低耦合
  重用性高
  部署快,生命周期成本低
  可维护性高
  缺点:
 
  增加了系统结构和实现的复杂性
  视图与控制器间的过于紧密的连接
  二、哪些框架使用到了mvc架构?
  目前现在php主流的框架都已经用到了mvc架构,例如:
 
  thinkPHP、Laravel、Yii 都有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 coreCore())->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 = 'appcontrollers'.$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();
 
  例如,要访问appcontrollersStudentController.php文件下的 demo 方法:
 
 
  <?phpnamespace appcontrollers;use corebaseController;class StudentController extends Controller{
 
      public function demo()
 
      {
 
          echo '写代码的光头强';

(编辑:揭阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读