Table of Contents
MVC directory structure
Database tool class production
Create public model classes and public controller classes
Home Backend Development PHP Tutorial PHP source code method to implement single entry MVC structure

PHP source code method to implement single entry MVC structure

Jul 04, 2018 pm 02:43 PM

This article mainly introduces the method of implementing single-entry MVC structure in PHP source code. It has certain reference value. Now I share it with you. Friends in need can refer to it.

Main:

  1. MVC directory structure

  2. Database tool class production

  3. Create public model classes and public controller classes

--------------:--------------------------------------
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图片
-----------------------------------------------------------------
Copy after login

MVC directory structure

1) Preparation: Create branch

1 $ git checkout master2 $ git checkout -b "mvc-dbtools-base"
Copy after login

2) Create directory structure:

MVC Directory: Model/ Controller/ View/

Static resource directory: Public/

3) Create the project entry file [index.php]

Copy the encoding of the original login.php header(...)

  Introducing the created controller UserController and model 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();
Copy after login

 4) Create controller 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 }
Copy after login

5) Create user model class UserModel [Model/UserModel.class.php]

Implementation method: checkLoginInfo() Check user name and password

<?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;
    }
}
Copy after login

View user model class

6) Login view: [view/login.html]

Modification of the introduction path,

Modification of the form submission 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>
Copy after login


Click to view the login view source code

Database connection operations are all in the model and can be extracted to create database operation tool classes

Database tool class production

Database connection, set encoding, select database

Implement singleton

Get one row of data getOneRow, get a single array getOneData, get multiple rows getAllRows, add, delete, modify exec

Automatically generate insert or update statements 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  }
Copy after login

Click to view the tool class

Create public model classes and public controller classes

 1) Public model class [Frame/BaseModel.class.php] Get database operation tool class instance

 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 }
Copy after login

 2) Public control Container class [Frame/BaseController]:

Unified coding

Prompt message jump

 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 }
Copy after login

3) Introduce tool classes, basic models and basic controller classes into the entry file

 【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();
Copy after login

Click to view the entry file

 4) User model class optimization【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 }
Copy after login

5) User controller login operation, jump prompt optimization

Use the public controller method 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     }
Copy after login

Merge, save and push to 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
Copy after login

Summary: Optimize the directory structure, create database operation classes, use basic model classes and basic controller classes

Next step: Implement singletons in model classes, further optimize the directory structure, and differentiate platforms (such as frontend, backend)

The above is the entire content of this article. I hope it will be helpful to everyone's study. For more related content, please pay attention to the PHP Chinese website!

Related recommendations:

A brief discussion on PHP source code five: About the creation of array array

A brief discussion on PHP source code one: explode and implode function

The above is the detailed content of PHP source code method to implement single entry MVC structure. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

How does session hijacking work and how can you mitigate it in PHP? How does session hijacking work and how can you mitigate it in PHP? Apr 06, 2025 am 12:02 AM

Session hijacking can be achieved through the following steps: 1. Obtain the session ID, 2. Use the session ID, 3. Keep the session active. The methods to prevent session hijacking in PHP include: 1. Use the session_regenerate_id() function to regenerate the session ID, 2. Store session data through the database, 3. Ensure that all session data is transmitted through HTTPS.

Describe the SOLID principles and how they apply to PHP development. Describe the SOLID principles and how they apply to PHP development. Apr 03, 2025 am 12:04 AM

The application of SOLID principle in PHP development includes: 1. Single responsibility principle (SRP): Each class is responsible for only one function. 2. Open and close principle (OCP): Changes are achieved through extension rather than modification. 3. Lisch's Substitution Principle (LSP): Subclasses can replace base classes without affecting program accuracy. 4. Interface isolation principle (ISP): Use fine-grained interfaces to avoid dependencies and unused methods. 5. Dependency inversion principle (DIP): High and low-level modules rely on abstraction and are implemented through dependency injection.

How to debug CLI mode in PHPStorm? How to debug CLI mode in PHPStorm? Apr 01, 2025 pm 02:57 PM

How to debug CLI mode in PHPStorm? When developing with PHPStorm, sometimes we need to debug PHP in command line interface (CLI) mode...

Framework Security Features: Protecting against vulnerabilities. Framework Security Features: Protecting against vulnerabilities. Mar 28, 2025 pm 05:11 PM

Article discusses essential security features in frameworks to protect against vulnerabilities, including input validation, authentication, and regular updates.

How to automatically set permissions of unixsocket after system restart? How to automatically set permissions of unixsocket after system restart? Mar 31, 2025 pm 11:54 PM

How to automatically set the permissions of unixsocket after the system restarts. Every time the system restarts, we need to execute the following command to modify the permissions of unixsocket: sudo...

Explain late static binding in PHP (static::). Explain late static binding in PHP (static::). Apr 03, 2025 am 12:04 AM

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

See all articles