Rumah  >  Artikel  >  pembangunan bahagian belakang  >  php源码之实现单入口MVC结构的方法

php源码之实现单入口MVC结构的方法

不言
不言asal
2018-07-04 14:43:102262semak imbas

这篇文章主要介绍了关于php源码之实现单入口MVC结构的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

主要:

  1. MVC目录结构

  2. 数据库工具类制作

  3. 创建公共模型类和公共控制器类

--------------:--------------------------------------
blog
├─index.php  入口文件
├─Model 模型
│  └─UserModel.class.php 用户模型类
├─View 视图
│  └─login.html  登录表单页面
├─Controller 控制器
│  └─UserController.class.php 用户控制器
├─Frame 公共使用的类
│   ├─BaseModel.class.php 数据库连接类
│   ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转)
│   └─Db.class.php 数据库操作工具类
└─Public   静态公共文件(js,css,images)
    ├─js/   js文件
    ├─css/  css样式文件
    └─images img图片
-----------------------------------------------------------------

MVC目录结构

  1)准备: 创建分支

1 $ git checkout master2 $ git checkout -b "mvc-dbtools-base"

  2) 创建目录结构:

      MVC目录: Model/  Controller/   View/  

        静态资源目录: Public/

  3) 创建项目入口文件  【index.php】

    拷贝原login.php的编码header(...)

    引入创建的控制器UserController 和 模型 UserModel

 1 <?php 
 2 /** 
 3  * 入口文件 
 4  */ 
 5 header("content-type:text/html;charset=utf-8"); 
 6  
 7 require_once(&#39;Model/UserModel.class.php&#39;); 
 8 require_once &#39;Controller/UserController.class.php&#39;; 
 9 
 10 //实例化控制器
 11 $userCtr = new UserController();
 12 
 13 $a = !empty($_GET[&#39;a&#39;]) ? $_GET[&#39;a&#39;] : &#39;login&#39;;
 14 
 15 $userCtr -> $a();

  4)  创建控制器UserController   【Controller/UserController.class.php】

 1 <?php 
 2 /** 
 3  * UserController.class.php 用户控制器 
 4  */ 
 5  
 6 class UserController { 
 7     /** 
 8      * 展示登录界面 
 9      * @access public
 10      */
 11     public function login()
 12     {
 13         include "View/login.html";
 14     }
 15 
 16     /**
 17      * 登录操作: 校验登录信息
 18      */
 19     public function dlogin()
 20     {
 21         //接收登录信息
 22         $data = array();
 23         $data[&#39;username&#39;] = trim($_POST[&#39;username&#39;]);
 24         $data[&#39;pwd&#39;] = trim($_POST[&#39;pwd&#39;]);
 25 
 26         //实例化模型,调用模型方法,校验用户名和密码
 27         $model = new UserModel();
 28         $result = $model->checkLoginInfo($data);
 29 
 30         //结果提示信息
 31         if($result){
 32             exit(&#39;登录成功&#39;);
 33         } else {
 34             echo "用户名或密码不正确!";
 35             header(&#39;refresh:3; url=?&#39;);
 36         }
 37     }
 38 }

  5)  创建用户模型类UserModel  【Model/UserModel.class.php】

    实现方法:checkLoginInfo() 检验用户名和密码

<?php/**
 * UserModel.class.php
 *     用户模型类-操作表pbg_users */class UserModel
{    /**
     * 检验登录信息
     * @param  array $data 用户提交的登录信息
     * @return bool       
     true-校验成功 false-校验失败     */
    public function checkLoginInfo($data)
    {        //连接数据库
        $conn = @mysql_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;root&#39;) or die(&#39;连接数据库失败!&#39;);        
        mysql_query(&#39;set names utf8&#39;,$conn);        
        mysql_query(&#39;use web&#39;,$conn);        //查询数据库
        $sql = "select username,pwd from pbg_users where username=&#39;{$data[&#39;username&#39;]}&#39;";        
        $res = mysql_query($sql,$conn);        //登录结果提示信息
        if($res !== false){            
        $user = mysql_fetch_array($res);            
        if( $user[&#39;pwd&#39;] == md5($data[&#39;pwd&#39;]) ){                
        return true;
            }
        }        return false;
    }
}

查看用户模型类

  6)登录视图:【view/login.html】

    引入路径的修正,

    表单提交action修正:  action=?a=dlogin

 1 <!DOCTYPE html> 
 2 <html lang="zh-CN"> 
 3 <head> 
 4     <meta charset="UTF-8"> 
 5     <title>登录</title> 
 6     <link rel="stylesheet" type="text/css" href="public/layui/css/layui.css"> 
 7     <link rel="stylesheet" type="text/css" href="public/css/style.css"> 
 8 </head> 
 9 <body>
 10 <p class="container">
 11     <p class="content">
 12         <form action="?a=dlogin" class="layui-form" method="post">
 13             <p class="layui-form-item">
 14                 <h2>登录</h2>
 15             </p><hr>
 16 
 17             <p class="layui-form-item">
 18                 <label class="layui-form-label">用户名:</label>
 19                 <p class="layui-input-block">
 20                     <input type="text" name="username" class="layui-input" required  lay-verify="required"  placeholder="请输入用户名" autocomplete="off" >
 21                 </p>22             </p>23 24             <p class="layui-form-item">25                 <label class="layui-form-label">密   码:</label>
 26                 <p class="layui-input-block">27                     <input type="password" name="pwd" required lay-verify="required" placeholder="请输入密码"  class="layui-input">
 28                 </p>29             </p>30 31             <p class="layui-form-item">
 32                 <p class="layui-input-block">
 33                     <button  lay-submit class="layui-btn">登录</button>
 34                     <button type="reset" class="layui-btn layui-btn-primary">重置</button>
 35                 </p>36             </p>37         </form>38     </p>39 </p>40 <script type="text/javascript" src="public/layui/layui.js"></script>41 <script>
 42     layui.use(&#39;form&#39;, function(){43         var form = layui.form;44     });45 </script>46 </body>47 </html>


点击查看登录视图源码

数据库连接操作都在模型中,可以提取出来制作数据库操作工具类

数据库工具类制作

数据库连接,设置编码,选择数据库

实现单例

获取一行数据getOneRow,  获取单个数组 getOneData, 获取多行getAllRows, 增删改 exec

自动生成insert 或 update语句 autoExecute()

【Frame/Db.class.php】

  1 <?php 
  2  /**  
  3   * Db.class.php 数据库操作工具类  
  4   * @author young  
  5   */  
  6    
  7  class Db  
  8  {  
  9      private $host; //主机 
  10      private $user; //用户名 
  11      private $pwd; //密码 
  12      private $port; //端口 
  13      private $charset; //编码 
  14      private $dbname; //数据库 
  15  
  16      private $link=null; //存储数据库资源 
  17      private static $instance=null; //存储本类实例对象 
  18  
  19      /** 
  20       * 构造方法: 保存数据库连接信息,连接数据库 
  21       * @access private 
  22       * @param array $conf 数据库连接信息 
  23       */ 
  24      private function __construct($conf) 
  25      { 
  26          $this->host = !empty($conf[&#39;host&#39;]) ? $conf[&#39;host&#39;] : &#39;localhost&#39;; 
  27          $this->user = !empty($conf[&#39;user&#39;]) ? $conf[&#39;user&#39;] : &#39;root&#39;; 
  28          $this->pwd = !empty($conf[&#39;pwd&#39;]) ? $conf[&#39;pwd&#39;] : &#39;root&#39;; 
  29          $this->port = !empty($conf[&#39;port&#39;]) ? $conf[&#39;port&#39;] : &#39;3306&#39;; 
  30          $this->charset = !empty($conf[&#39;charset&#39;]) ? $conf[&#39;charset&#39;] : &#39;utf8&#39;; 
  31          $this->dbname = !empty($conf[&#39;dbname&#39;]) ? $conf[&#39;dbname&#39;] : &#39;web&#39;; 
  32  
  33          $this->connect(); 
  34      } 
  35  
  36      /** 
  37       * 连接数据库,设置编码,选库 
  38       * @access private 
  39       */ 
  40      private function connect() 
  41      { 
  42          $this->link = @ mysql_connect("{$this->host}:{$this->port}", "$this->user", "$this->pwd") or die(&#39;连接失败!&#39;.mysql_error()); 
  43          $this->setCharset($this->charset); 
  44          $this->useDb($this->dbname); 
  45      } 
  46      /** 
  47       * 设置字符便 
  48       * @access public 
  49       * @param string $char 字符编码 
  50       */ 
  51      public function setCharset($char) 
  52      { 
  53          $this->query("set names $char"); 
  54      } 
  55      /** 
  56       * 选择数据库 
  57       * @access public 
  58       * @param string $dbname 数据库名称 
  59       */ 
  60      public function useDb($dbname) 
  61      { 
  62          $this->query("use $dbname"); 
  63      } 
  64  
  65      /** 
  66       * 执行sql语句 
  67       * @param  string $sql sql语句 
  68       * @return mixed 
  69       */ 
  70      private function query($sql) 
  71      { 
  72          $result = mysql_query($sql, $this->link); 
  73          if(false === $result) { 
  74              echo "<p>sql执行失败!<br>"; 
  75              echo "<br>失败语句:".$sql; 
  76              echo "<br>错误代号".mysql_errno(); 
  77              echo "<br>错误提示: ".mysql_error()."</p>"; 
  78              exit(); 
  79          } 
  80          return $result; 
  81      } 
  82  
  83      /** 
  84       *  获取本类实例 
  85       * @access public 
  86       * @param  array $conf 数据库连接信息 
  87       * @return  object     本类的单例对象 
  88       */ 
  89      public static function getDb($conf) 
  90      { 
  91          if(false === (static::$instance instanceof static)){ 
  92              static::$instance = new static($conf); 
  93          } 
  94          return static::$instance; 
  95      } 
  96      /** 
  97       * 禁止克隆 
  98       */ 
  99      public function __clone()
  100      {
  101      
  102      }
  103      /**
  104       * 关闭数据库连接
  105       * @access public
  106       */
  107      public function closeDb()
  108      {
  109          mysql_close($this->link);
  110      }
  111 
  112      public function exec($sql)
  113      {
  114          $result = $this->query($sql);
  115          return $this->affectedRows();
  116 
  117      }
  118      /**
  119       * 受影响的行数
  120       * @return int 返回受影响的行数
  121       */
  122      private function affectedRows()
  123      {
  124          return mysql_affected_rows($this->link);
  125      }
  126 
  127      /**
  128       * 执行 “返回一行数据”的查询
  129       * @param  string $sql sql语句
  130       * @return array      一维数组(一行)
  131       */
  132      public function getOneRow($sql)
  133      {
  134          $result = $this->query($sql);
  135          $data = mysql_fetch_assoc($result);
  136          mysql_free_result($result);
  137          return $data;
  138      }
  139      /**
  140       * 执行 "返回多行数据" 的查询
  141       * @param  string $sql sql语句
  142       * @return array      二维数组
  143       */
  144      public function getAllRows($sql)
  145      {
  146          $result = $this->query($sql);
  147          $data = array();
  148          while($row = mysql_fetch_assoc($result)){
  149              $data[] = $row;
  150          }
  151          mysql_free_result($result);
  152          return $data;
  153      }
  154      /**
  155       * 执行“获取一个数据”的查询
  156       * @param  string $sql sql语句
  157       * @return mixed      标量数据值
  158       */
  159      public function getOneData($sql)
  160      {
  161          $result = $this->query($sql);
  162          $data = mysql_fetch_row($result);
  163          mysql_free_result($result);
  164          return $data[0];
  165      }
  166 
  167      /**
  168       * 上次insert时的自增长id值
  169       * @return int insert时的id值
  170       */
  171      public function getInsertId()
  172      {
  173          return mysql_insert_id($this->link);
  174      }
  175 
  176      /**
  177       * 序列化时,对指定数据进行序列化
  178       * @return array 指定进行序列化的数据
  179       */
  180      public function __sleep()
  181      {
  182          return array(&#39;host&#39;, &#39;port&#39;, &#39;user&#39;, &#39;pass&#39;,&#39;charset&#39;, &#39;dbname&#39;);
  183      }
  184      /**
  185       * 反序列化时,使用相应数据连接数据库
  186       */
  187      public function __wakeup()
  188      {
  189          $this->connect(); //连接数据库
  190      }
  191      /**
  192     * 自动生成insert语句或update语句
  193     * @param array      $data          insert或update的数据
  194     * @param  string     $table        操作的数据表
  195     * @param  string     $act           是update还是insert操作
  196     * @param  string     $where      where条件 如 id=2  如果是update必须加,否则不执行直接返回false
  197     * @return bool        执行insert与update的结果
  198     */
  199      public function autoExecute($data, $table, $act=&#39;insert&#39;, $where=&#39;&#39;)
  200      {
  201          if($act == &#39;insert&#39;) {
  202              $sql = "insert into ".$table."(";
  203              $sql .=implode(",", array_keys($data));
  204              $sql .= ") values (&#39;";
  205              $sql .= implode("&#39;,&#39;", array_values($data));
  206              $sql .= "&#39;)";
  207 
  208              $res = $this->exec($sql);
  209               return $this->getInsertId();
  210 
  211          } else if($act == &#39;update&#39;) {
  212              if(!$where) { return false; }
  213              $sql = &#39;update &#39;.$table.&#39; set &#39;;
  214              foreach ($data as $k => $v) {
  215                  $sql .= $k."=&#39;".$v."&#39;,";
  216              }
  217              $sql = substr($sql, 0, -1);
  218              $sql .= &#39; where &#39;.$where;
  219 
  220              return $this->exec($sql);
  221          } else {
  222              return false;
  223          }
  224 
  225      }
  226  }

点击查看工具类

创建公共模型类和公共控制器类

  1) 公共模型类【Frame/BaseModel.class.php】  获取数据库操作工具类实例

 1 <?php
 2  
 3 /** 
 4  * BaseModel.class.php 基础模型类 
 5  *     连接数据库 
 6  */ 
 7 class BaseModel 
 8 { 
 9     protected $db = null;
 10     /**
 11      * 构造方法: 实例化数据库类
 12      * @access public13      * @param array $config  数据库配置信息
 14      */
 15     function __construct(array $config=null)
 16     {
 17         $conf = array(
 18             &#39;host&#39;=>&#39;localhost&#39;,
 19             &#39;user&#39;=>&#39;root&#39;,
 20             &#39;pwd&#39;=>&#39;root&#39;,
 21             &#39;port&#39;=>&#39;3306&#39;,
 22             &#39;charset&#39;=>&#39;utf8&#39;,
 23             &#39;dbname&#39;=>&#39;web&#39;,
 24         );
 25         $conf = empty($config)? $conf : array_merge($conf,$config);
 26         $this->db = Db::getDb($conf);
 27     }
 28 }

  2) 公共控制器类【Frame/BaseController】 :

    统一了编码

    提示信息跳转

 1 <?php 
 2 /** 
 3  * BaseController.class.php  公共控制器 
 4  * @author young 
 5  */ 
 6  
 7 class BaseController 
 8 { 
 9     /**
 10      * 统一编码utf8
 11      */
 12     public function __construct()
 13     {
 14         header("content-type:text/html;charset=utf-8");
 15         session_start();
 16     }
 17 
 18     /**
 19      * 跳转提示
 20      * @access public
 21      * @param  string  $msg  跳转提示信息
 22      * @param  string  $url  跳转的地址
 23      * @param  integer $time 等待时间 秒数
 24      */
 25     public function msg($msg=&#39;&#39;, $url=&#39;?&#39;, $time=3)
 26     {
 27         echo "<p><a href=&#39;$url&#39;>返回</a></p>页面将在{$time}秒之后跳转!!";
 28         header("refresh: $time; url=$url");
 29         exit("<p><span style=&#39;color:red&#39;>$msg</span></p>");
 30     }
 31 }

  3)入口文件中引入工具类,基础模型和基础控制器类

  【index.php】

 1 <?php 
 2 /** 
 3  * 入口文件 
 4  */
 5 require_once &#39;Frame/Db.class.php&#39;; 
 6 require_once &#39;Frame/BaseModel.class.php&#39;; 
 7 require_once(&#39;Model/UserModel.class.php&#39;); 
 8 require_once &#39;Frame/BaseController.class.php&#39;; 
 9 require_once &#39;Controller/UserController.class.php&#39;;
 10 
 11 //实例化控制器
 12 $userCtr = new UserController();
 13 
 14 $a = !empty($_GET[&#39;a&#39;]) ? $_GET[&#39;a&#39;] : &#39;login&#39;;
 15 
 16 $userCtr -> $a();

点击查看入口文件

  4)用户模型类优化 【Model/UserModel.class.php】

 1 <?php 
 2  
 3 /**
 4  * UserModel.class.php 
 5  *     用户模型类-操作表pbg_users 
 6  */ 
 7 class UserModel extends BaseModel 
 8 { 
 9     /**
 10      * 检验登录信息
 11      * @param  array $data 用户提交的登录信息
 12      * @return bool       true-校验成功 false-校验失败
 13      */
 14     public function checkLoginInfo($data)
 15     {
 16         $sql = "select id,username,pwd from pbg_users where username=&#39;{$data[&#39;username&#39;]}&#39;";
 17         $res = $this->db->getOneRow($sql);
 18         return $res[&#39;pwd&#39;] == md5($data[&#39;pwd&#39;]) ? : false;
 19     }
 20 }

  5) 用户控制器登录操作,跳转提示优化

    使用公共控制器方法msg()

 1 。。。。。。。 
 2     /** 
 3      * 登录操作: 校验登录信息 
 4      */ 
 5     public function dlogin() 
 6     { 
 7         //接收登录信息 
 8         $data = array(); 
 9         $data[&#39;username&#39;] = trim($_POST[&#39;username&#39;]);
 10         $data[&#39;pwd&#39;] = trim($_POST[&#39;pwd&#39;]);
 11 
 12         //实例化模型,调用模型方法
 13         $model = new UserModel();
 14         $result = $model->checkLoginInfo($data);
 15         //跳转提示
 16         if($result){
 17             $this->msg(&#39;登录成功!&#39;, &#39;?a=index&#39;,3);
 18         } else {
 19             $this->msg(&#39;用户名或密码不正确!!&#39;);
 20         }
 21     }

合并保存并推送git

1 $ git add -A
2 $ git commit -m "MVC结构,数据库操作类,基础模型类和基础控制器类制作"
3 $ git checkout master
4 $ git merge mvc-dbtools-base
5 $ git push origin master

小结: 优化目录结构,制作数据库操作类,基础模型类与基础控制器类使用

下一步: 模型类实现单例, 进一步优化目录结构,区分平台(如前台,后台)

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

浅谈PHP源码五:关于array 数组的创建

浅谈PHP源码一:explode和implode函数

Atas ialah kandungan terperinci php源码之实现单入口MVC结构的方法. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn