php源碼之實現單入口MVC結構的方法

來源:互聯網
上載者:User
這篇文章主要介紹了關於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('Model/UserModel.class.php');  8 require_once 'Controller/UserController.class.php';  9  10 //執行個體化控制器 11 $userCtr = new UserController(); 12  13 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; 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['username'] = trim($_POST['username']); 24         $data['pwd'] = trim($_POST['pwd']); 25  26         //執行個體化模型,調用模型方法,校正使用者名稱和密碼 27         $model = new UserModel(); 28         $result = $model->checkLoginInfo($data); 29  30         //結果提示資訊 31         if($result){ 32             exit('登入成功'); 33         } else { 34             echo "使用者名稱或密碼不正確!"; 35             header('refresh:3; url=?'); 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('localhost','root','root') or die('串連資料庫失敗!');                mysql_query('set names utf8',$conn);                mysql_query('use web',$conn);        //查詢資料庫        $sql = "select username,pwd from pbg_users where username='{$data['username']}'";                $res = mysql_query($sql,$conn);        //登入結果提示資訊        if($res !== false){                    $user = mysql_fetch_array($res);                    if( $user['pwd'] == md5($data['pwd']) ){                        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">密&nbsp;&nbsp;&nbsp;碼:</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('form', 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['host']) ? $conf['host'] : 'localhost';   27          $this->user = !empty($conf['user']) ? $conf['user'] : 'root';   28          $this->pwd = !empty($conf['pwd']) ? $conf['pwd'] : 'root';   29          $this->port = !empty($conf['port']) ? $conf['port'] : '3306';   30          $this->charset = !empty($conf['charset']) ? $conf['charset'] : 'utf8';   31          $this->dbname = !empty($conf['dbname']) ? $conf['dbname'] : 'web';   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('串連失敗!'.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('host', 'port', 'user', 'pass','charset', 'dbname');  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='insert', $where='')  200      {  201          if($act == 'insert') {  202              $sql = "insert into ".$table."(";  203              $sql .=implode(",", array_keys($data));  204              $sql .= ") values ('";  205              $sql .= implode("','", array_values($data));  206              $sql .= "')";  207   208              $res = $this->exec($sql);  209               return $this->getInsertId();  210   211          } else if($act == 'update') {  212              if(!$where) { return false; }  213              $sql = 'update '.$table.' set ';  214              foreach ($data as $k => $v) {  215                  $sql .= $k."='".$v."',";  216              }  217              $sql = substr($sql, 0, -1);  218              $sql .= ' where '.$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             'host'=>'localhost', 19             'user'=>'root', 20             'pwd'=>'root', 21             'port'=>'3306', 22             'charset'=>'utf8', 23             'dbname'=>'web', 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='', $url='?', $time=3) 26     { 27         echo "<p><a href='$url'>返回</a></p>頁面將在{$time}秒之後跳轉!!"; 28         header("refresh: $time; url=$url"); 29         exit("<p><span style='color:red'>$msg</span></p>"); 30     } 31 }

  3)入口檔案中引入工具類,基本模型和基礎控制器類

  【index.php】

 1 <?php  2 /**  3  * 入口檔案  4  */ 5 require_once 'Frame/Db.class.php';  6 require_once 'Frame/BaseModel.class.php';  7 require_once('Model/UserModel.class.php');  8 require_once 'Frame/BaseController.class.php';  9 require_once 'Controller/UserController.class.php'; 10  11 //執行個體化控制器 12 $userCtr = new UserController(); 13  14 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; 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='{$data['username']}'"; 17         $res = $this->db->getOneRow($sql); 18         return $res['pwd'] == md5($data['pwd']) ? : false; 19     } 20 }

  5) 使用者控制器登入操作,跳轉提示最佳化

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

 1 。。。。。。。  2     /**  3      * 登入操作: 校正登入資訊  4      */  5     public function dlogin()  6     {  7         //接收登入資訊  8         $data = array();  9         $data['username'] = trim($_POST['username']); 10         $data['pwd'] = trim($_POST['pwd']); 11  12         //執行個體化模型,調用模型方法 13         $model = new UserModel(); 14         $result = $model->checkLoginInfo($data); 15         //跳轉提示 16         if($result){ 17             $this->msg('登入成功!', '?a=index',3); 18         } else { 19             $this->msg('使用者名稱或密碼不正確!!'); 20         } 21     }

合并儲存並推送git

1 $ git add -A2 $ git commit -m "MVC結構,資料庫操作類,基本模型類和基礎控制器類製作"3 $ git checkout master4 $ git merge mvc-dbtools-base5 $ git push origin master

小結: 最佳化目錄結構,製作資料庫操作類,基本模型類與基礎控制器類使用

下一步: 模型類實現單例, 進一步最佳化目錄結構,區分平台(如前台,後台)

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.