贯彻单入口MVC结构,php源码建博客4

主要:

主要:

主要:

构成thinkphp官网
3.1入门教程和3.2.1技艺手册初步对thinkphp实行学习,thinkphp是mvc能够很好地划分各部分。

thinkphp的php执行代码大多是指控制器方法个中实现的,控制器方法可以没有对应的出口模板,假若有则输出模板会以html的样式与办法对应,数据库的操作是大抵经过模型落成的。

1.改动项目路线(工作根目录)

thinkphp3.2.1私下认可工作根目录是/web/Applications

当用户访问

修改项目路线:在根目录下修改index.php

define(‘APP_PATH’,’./application/’);

define(‘APP_PATH’,’./app/’);

访问 自动生成相关文书

根目录下修改:

define(‘BIND_MODULE’,’Admin’);

// 定义应用目录

define(‘APP_PATH’,’./App/’);

2.在办事根目录文件夹下创造模块

在办事下新建文件夹Admin,并成立空白index.html 在根目录下index.php添加

//添加

define(‘BIND_MODULE’,’Admin’);

// 定义应用目录

贯彻单入口MVC结构,php源码建博客4。define(‘APP_PATH’,’./App/’);

浏览器当中访问: 便能够在admin模块个中自动生成全数的有关文书(类似于一致文件夹下的Home文件夹)

留意要在扭转完全部之后注释掉define(‘BIND_MODULE’,’Admin’);

3.thinkphp入口:

thinkphp 3.2.壹唯有3个默许的进口地址正是index控制器的index方法。

访问

4.thinkphp url

url路径:

模块Home (前台)

模块Admin: (后台)

参数粗传递

thinkphp方法内可以使用U()函数成立U索罗德L        U(控制器名/方法)

例如   myurl=U(Index/index)

5.视图view  模板

thinkphp3.2.1个中假诺艺术要对应着输出html
那么模板的地点在view文件夹下对应的控制器文件夹下的同名html文件夹。

透过$this->display ();启用模板;通过$this->aa =
$bb;完毕php到html的变量映射,在html 当中使用{$aa}接收。

例如

/web/App/Home/Controller/IndexController.class.php
里面的univpage()方法:

public function univpage($id) {  $this->univ_id = $id;//变量映射 $this->display ();//启用模板 }

对应的模板位置为/web/App/Home/View/Index/index.html

<html> ................... <body> hello {$univ_id } </body> </html>

访问
 便足以输出id的值一千2

6.模型model

模型的成效是用于数据库操作,能够便宜不难的贯彻CUCRUISERD,而且还足以兑现全自动获取表单,对交付表单实行自动验证等。

每种品种有一个总是的数据库配置文件,执行CUCRUISERD命令时调用连接数据库。

各样品种的数据库连接配置都以在各样类别的/common/conf/config.php文件个中,如F:\web\App\Common\Conf\config.php,连接数据库是使用D和M时自动到config.php当中找到有关配置连接数据库。

'DB_DSN' => 'mysql://root:881234@192.168.1.249:3306/univinfo'

诸如进行一下实例化操作:

$Data = M('think_data'); // 实例化Data数据模型

系统会活动使用/common/conf/config.php个中的数据库连接文件三番五次数据库,然后选取之中的think_data表。

当执行实例化对象create()函数时会自动获得表单传递过来的数据,

thinkphp**付出表单:留神提交表单要,使用M()D()**时,一定要专注提交的表单的参数名要和数据库表个中的字段完全一致才能够履行机关匹配。

例如:

模板提交参数

<form action="__URL__/login_submit" method="get"> Name: <input type="text" name="user_name" /> Password: <input type="text" name="user_password" /> <input type="submit" /> </form>

控制器内方法接收传递过来参数

public function register_submit() {   // echo "register_submit()";   $User = M ( 'univ_user_basic_info' ); // 实例化模型   $User->create (); // 获取post提交过来的表单(注意可能只是post可以)   echo $User->user_name;   // dump($User); //展示数据库状况   $User->add (); // 写入数据库   echo "register success";  }

  1. 模型单例工厂
  2. 目录结构优化
  3. 分别平台(前台,后台….)
  1. 常量优化路径
  2. 机动加载类
  3. 优化进口文件
  4. 康宁访问项目目录
  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图片

版权证明:本文为博主原创文章,未经博主允许不得转载。





--------------文件结构:--------------------------------------
blog
├─App
│  ├─Model 模型
│  │  └─UserModel.class.php 用户模型类    
│  ├─View 视图
│  │  ├─Back后台
│  │  │  └─Index
│  │  │          └─index.html  后台首页面
│  │  └─Home前台
│  │      └─User 用户视图目录
│  │             └─login.html  登录表单页面
│  ├─Controller 控制器
│  │  ├─Back后台
│  │  │  └─IndexController.class.php 后台首页控制器
│  │  └─Home前台
│  │      └─UserController.class.php 用户控制器
├─Public   静态公共文件(js,css,images)
│  ├─Plugins 插件
│  │  └─layui 前端框架插件
│  ├─Back后台
│  │    ├─js/   js文件
│  │    ├─css/  css样式文件
│  │    └─image img图片 
│  └─Home前台
│      ├─js/   js文件
│      ├─css/  css样式文件
│      └─image img图片 
├─Frame 公共使用的类
│   ├─BaseModel.class.php 数据库连接类
│   ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转)
│   ├─FactoryModel.class.php  模型工厂类
│   └─MySQLDB.class.php 数据库操作工具类
└─index.php  入口文件
----------------------------------------------------------------
--------------文件结构:--------------------------------------
blog
├─App
│  ├─Model 模型
│  │  └─UserModel.class.php 用户模型类    
│  ├─View 视图
│  │  ├─Back后台
│  │  │  └─Index
│  │  │          └─index.html  后台首页面
│  │  └─Home前台
│  │      └─User 用户视图目录
│  │             └─login.html  登录表单页面
│  ├─Controller 控制器
│  │  ├─Back后台
│  │  │  └─IndexController.class.php 后台首页控制器
│  │  └─Home前台
│  │      └─UserController.class.php 用户控制器
├─Public   静态公共文件(js,css,images)
│  ├─Plugins 插件
│  │  └─layui 前端框架插件
│  ├─Back后台
│  │    ├─js/   js文件
│  │    ├─css/  css样式文件
│  │    └─image img图片 
│  └─Home前台
│      ├─js/   js文件
│      ├─css/  css样式文件
│      └─image img图片 
├─Frame 公共使用的类
│   ├─BaseModel.class.php 数据库连接类
│   ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转)
│   ├─FactoryModel.class.php  模型工厂类
│   ├─Init.class.php  初始化应用类
│   └─MySQLDB.class.php 数据库操作工具类
└─index.php  入口文件
-----------------------------------------------------------------

MVC目录结构

  1)准备: 创设分支

1 $ git checkout master
2 $ 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() 检验用户名和密码

亚洲必赢官网 1亚洲必赢官网 2

<?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

亚洲必赢官网 3亚洲必赢官网 4

 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 <div class="container">
11     <div class="content">
12         <form action="?a=dlogin" class="layui-form" method="post">
13             <div class="layui-form-item">
14                 <h2>登录</h2>
15             </div><hr>
16 
17             <div class="layui-form-item">
18                 <label class="layui-form-label">用户名:</label>
19                 <div class="layui-input-block">
20                     <input type="text" name="username" class="layui-input" required  lay-verify="required"  placeholder="请输入用户名" autocomplete="off" >
21                 </div>
22             </div>
23 
24             <div class="layui-form-item">
25                 <label class="layui-form-label">密&nbsp;&nbsp;&nbsp;码:</label>
26                 <div class="layui-input-block">
27                     <input type="password" name="pwd" required lay-verify="required" placeholder="请输入密码"  class="layui-input">
28                 </div>
29             </div>
30 
31             <div class="layui-form-item">
32                 <div class="layui-input-block">
33                     <button  lay-submit class="layui-btn">登录</button>
34                     <button type="reset" class="layui-btn layui-btn-primary">重置</button>
35                 </div>
36             </div>
37         </form>
38     </div>
39 </div>
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】

亚洲必赢官网 5亚洲必赢官网 6

  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  }

点击查阅工具类

 下载查看该品种源码:

上一篇中,提出几个难题待消除,本篇集中国化学工业进出口总集团解那五个难点,最后形成全部的微型MVC架构,
后续博客项目,或任何门类,均能够一直运用该架构进行付出学习。

创立公共模型类和国有控制器类

  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 public
13      * @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 "<div><a href='$url'>返回</a></div>页面将在{$time}秒之后跳转!!";
28         header("refresh: $time; url=$url");
29         exit("<div>$msg</div>");
30     }
31 }

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

  【index.php】

亚洲必赢官网 7亚洲必赢官网 8

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

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

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

模型单例工厂

准备: 创制分支

1 $ git checkout master
2 $ git checkout -b "folder-model-app"

说明:

  1)程序中3行 。。。 表示省略的代码。从后面或源码中可查看

  2) 【XXX/XXX】表示项目文件相对路径

下载查看该类型源码:

  思路:

  难题:
项目中模型操作数据表,3个动作恐怕即将操作二回数据库,二次呼吁五个动作,每一个动作都须求去实例化对应模型

  化解想法: 创立1个模型类单例工厂
       完结: 创设单例的模型类  FactoryModel.class.php
          属性$model=array(); 存款和储蓄模型类实例
          方法: M($cmodelName, array $conf=null) 实例化模型类
      使用: 控制器中央银行使模型类实例:$model=FactoryModel::M(‘模型名称’)

常量优化路径

准备: 成立分支

1 $ git checkout master
2 $ git checkout -b "MVC"

  代码达成

1) 成立模型单例工厂 【Frame/FactoryModel.class.php】

 1 <?php
 2 /**
 3  * 单例模型工厂类
 4  * User: young
 5  */
 6 
 7 class FactoryModel
 8 {
 9     protected static $model = array(); //存储模型类实例
10 
11     /**
12      * 构造方法
13      */
14     protected function  __construct()
15     {
16     }
17 
18     /*
19      * 传递一个模型类的类名,就返回该类的一个单例实例对象
20     *@param string $modelName  模型类的类名
21     *@param array  $conf  数据库配置信息
22     *@return object 传入模型类的实例(单例)
23     */
24     public static function M($modelName, array $conf=null)
25     {
26         $modelName = $modelName.'Model';
27         if(empty(static::$model[$modelName]) || !(static::$model[$modelName] instanceof $modelName)){
28             static::$model[$modelName] = new $modelName($conf);
29         }
30         return static::$model[$modelName];
31     }
32 }

2) 引入该类文件 【index.php】

亚洲必赢官网 9亚洲必赢官网 10

 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 
 9 require_once 'Frame/FactoryModel.class.php';//模型工厂类
10 。。。
11 。。。
12 。。。

输入文件引入工厂模型类

3) 应用: 控制器中动用,如用户控制器UserController中
登录操作【Controller/UserController.class.php】

 1  <?php
 2 /**
 3  * UserController.class.php 用户控制器
 4  */
 5 
 6 class UserController  extends  BaseController{
 7     。。。
 8     。。。
 9     。。。
10 
11     /**
12      * 登录操作: 校验登录信息
13      */
14     public function dlogin()
15     {
16         //接收登录信息
17         $data = array();
18         $data['username'] = trim($_POST['username']);
19         $data['pwd'] = trim($_POST['pwd']);
20 
21         //实例化模型,调用模型方法
22         //$model = new UserModel();
23         //$result = $model->checkLoginInfo($data);
24         //替换上面两行
25         $result = FactoryModel::M('User')->checkLoginInfo($data);
26 
27         //跳转提示
28         if($result){
29             $this->msg('登录成功!', '?a=index',3);
30         } else {
31             $this->msg('用户名或密码不正确!!');
32         }
33     }
34 }

4) 测试程序运营, 
登录测试结果与前边一致。一时半刻先交给代码

1 git add -A
2 git commit -m "完成模型工厂类"

  思路

  1)把常用的目录路径定义成常量。如 模型目录,控制器目录等
     2)引入类应用定义的常量替代部分路线。 如 include
FRAME.BaseModel.class.php
       3) 载入视图使用常量替代部分路线 如 include VIEW.’login.html’
简单款式

目录结构优化

  代码达成

 1)操作步骤

亚洲必赢官网 11亚洲必赢官网 12

step 1: 在入口文件中定义所需要的常量

step 2: 控制器中引入视图时, 使用常量进行优化 

操作步骤思路

亚洲必赢官网 ,  2) 入口文件中定义常用路径常量 【index.php】

 1 <?php
 2 /**
 3  * 入口文件
 4  */
 5 $p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台
 6 $c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器
 7 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作
 8 
 9 define('PLAT', $p);  //平台常量
10 define('CTR', $c);  //控制器
11 define('ACTION', $a); //动作
12 
13 
14 define('DS', DIRECTORY_SEPARATOR); //目录分割符
15 define('ROOT', getcwd().DS);  //当前所在目录 项目目录
16 define('FRAME', ROOT.'Frame'.DS);
17 define('APP', ROOT.'App'.DS);
18 define('PUB', ROOT.'Public'.DS);
19 define('ADMIN', PUB.'Admin'.DS);
20 define('HOME', PUB.'Home'.DS);
21 
22 //MVC目录
23 define('MODEL', APP.'Model'.DS);
24 define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS);
25 define('CTRONLLER', APP.'Controller'.DS.PLAT.DS);
26 
27 $ctr = $c."Controller";
28 
29 require_once FRAME.'Db.class.php';  //数据库操作类
30 require_once FRAME.'BaseModel.class.php';  //基础模型类
31 require_once MODEL.'UserModel.class.php';  //用户模型类
32 require_once FRAME.'FactoryModel.class.php';//模型工厂类
33 require_once FRAME.'BaseController.class.php'; //基础控制器类
34 require_once CTRONLLER.$ctr.'.class.php';
35 
36 
37 //实例化控制器
38 $userCtr = new $ctr();
39 
40 $userCtr -> $a();

2) 常量的运用:

  后台首页控制器【App/Controller/Admin/IndexController.class.php】

亚洲必赢官网 13亚洲必赢官网 14

 1 <?php
 2 /**
 3  * IndexController控制器类
 4  * 后台相关操作
 5  * User: young
 6  */
 7 
 8 class IndexController extends BaseController
 9 {
10     //展示后台首页
11     public function index()
12     {
13         include VIEW.'index.html';
14     }
15 }

后台首页控制器引入视图路径修改

  用户控制器
登录视图引入路径【App/Controller/Home/UserController.class.php】

亚洲必赢官网 15亚洲必赢官网 16

 1 <?php
 2 /**
 3  * UserController.class.php 用户控制器
 4  */
 5 
 6 class UserController  extends  BaseController{
 7     /**
 8      * 展示登录界面
 9      * @access public
10      */
11     public function login()
12     {
13         include VIEW."login.html";
14     }
15 。。。
16 。。。
17 。。。

用户控制器登录视图引入路径

3)提交代码

$  git add -A
$  git commit -m "常量使用"

   思路

 八个阳台(模块):前后,后台
        MVC结构分平台
            C:  Controllers/Home      Controllers/Admin  …..
            V:  Views/Home                Views/Admin  …..
            M:   操作数据表一般模块共用
        公共财富目录Public: Public/Home  Public/Admin  …..
     目录结构转变,全数载入类,视图的路子做相应变化 

活动加载类

  代码完结

1)操作步骤

亚洲必赢官网 17亚洲必赢官网 18

1)目录构建: 
step 1: 根目录下创建目录App, 将Model目录,View目录,Controller目录放大App目录下
 既根目录只有: App/ Public/ Frame/  index.php

step 2: 在Controller目录中,创建Back目录和Home目录。将UserController控制器类文件放入Home目录中

step 3: 在View目录中,创建Back目录和Home目录。将login.html文件放入Home目录中

step 4: 在Public目录中,创建Back目录,Home目录,Plugins目录。将js,images,css目录放入Home目录中,公共插件放入对应的Plugins目录中

2)文件引入修改:
step 5: index.php入口文件对UserCotroller类的引入路径修改

step 6:UserController类中对视图login.html的include路径的修改

step 7: 视图login.html中对css和js路径的引入

操作步骤思路

2) 具体代码修改操作

  入口文件引入类路径修改【index.php】
主借使用户模型类和用户控制器类路径引入修改

亚洲必赢官网 19亚洲必赢官网 20

 1 <?php
 2 /**
 3  * 入口文件
 4  */
 5 require_once 'Frame/Db.class.php';  //数据库操作类
 6 require_once 'Frame/BaseModel.class.php';  //基础模型类
 7 require_once 'App/Model/UserModel.class.php';
 8 
 9 require_once 'Frame/FactoryModel.class.php';//模型工厂类
10 
11 require_once 'Frame/BaseController.class.php';  //基础控制器类
12 require_once 'App/Controller/Home/UserController.class.php';
13 
14 //实例化控制器
15 $userCtr = new UserController();
16 
17 $a = !empty($_GET['a']) ? $_GET['a'] : 'login';
18 
19 $userCtr -> $a();

输入文件引入类的修改

  用户控制器类对登录表单视图路径引入的修改
【App/Controller/Home/UserController.class.php】

亚洲必赢官网 21亚洲必赢官网 22

 1 <?php
 2 /**
 3  * UserController.class.php 用户控制器
 4  */
 5 
 6 class UserController  extends  BaseController{
 7     /**
 8      * 展示登录界面
 9      * @access public
10      */
11     public function login()
12     {
13         include "App/View/Home/User/login.html";
14     }
15 。。。
16 。。。
17 。。。

用户控制器显示登录界面修改

  登录表单视图 【App/View/Home/User/login.html】 对静态能源路径的改动

亚洲必赢官网 23亚洲必赢官网 24

 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/plugins/layui/css/layui.css">
 7     <link rel="stylesheet" type="text/css" href="public/Home/css/style.css">
 8 </head>
 9 。。。
10 。。。
11 。。。
12 <script type="text/javascript" src="public/plugins/layui/layui.js"></script>
13 <script>
14     layui.use('form', function(){
15         var form = layui.form;
16     });
17 </script>
18 </body>
19 </html>

登录表单视图

   思路

  问题: 入口文件中早就require_once
引入5个类,既扩展二个急需引入四个,简单遗漏,重复和失误。

  化解方法:自动加载类文件

     格局1: 使用机关加载类函数__autoload()能够兑现机关加载
          格局2: 实际项目中,多个人支付,依照实用性,更加多的是应用
sql_autoload_register()注册函数自动加载

  依据目录的性状完结活动加载
          Model类文件特点,以Model结尾的类名  substr($className,-5)
          Controller文件特点: 以Controller结尾的类名,
substr($class,-10)

    公共类:
类名没有统一样式,能够将Fame下的公共类放入到数组中,然后判断类是否在数组中,
从而自动加载该目录下的类公事

  效果及提交代码

 亚洲必赢官网 25交给保存代码

1 git add -A
2 git commit -m "目录结构优化"

  代码实现

   1) 入口文件贯彻类的活动加载

 1 <?php
 2 /**
 3  * 入口文件
 4  */
 5 $p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台
 6 $c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器
 7 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作
 8 
 9 define('PLAT', $p);  //平台常量
10 define('CTR', $c);  //控制器
11 define('ACTION', $a); //动作
12 
13 
14 define('DS', DIRECTORY_SEPARATOR); //目录分割符
15 define('ROOT', getcwd().DS);  //当前所在目录 项目目录
16 define('FRAME', ROOT.'Frame'.DS);
17 define('APP', ROOT.'App'.DS);
18 define('PUB', ROOT.'Public'.DS);
19 define('ADMIN', PUB.'Admin'.DS);
20 define('HOME', PUB.'Home'.DS);
21 
22 //MVC目录
23 define('MODEL', APP.'Model'.DS);
24 define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS);
25 define('CTRONLLER', APP.'Controller'.DS.PLAT.DS);
26 
27 $ctr = $c."Controller";
28 
29 spl_autoload_register('autoload'); //注册自动加载函数
30 //自动加载类
31 /**
32  * 实自动加载类文件
33  * @param  string $className 类名
34  */
35 function autoload($className)
36 {
37     $upperClassName = strtoupper($className);
38     $frame = array('BaseController','BaseModel','Db','FactoryModel');
39     if(in_array($className, $frame)) {  //加载公共Frame目录中的类文件
40         require_once FRAME."$className.class.php";
41     } elseif(substr($upperClassName, -5) == 'MODEL'){  //加载模型Model目录中的类文件
42         require_once MODEL."$className.class.php";
43     } elseif(substr($upperClassName, -10) == 'CONTROLLER'){  //加载控制器目录中的类文件
44         require_once CTRONLLER."$className.class.php";
45     }
46 }
47 
48 //实例化控制器
49 $userCtr = new $ctr();
50 $userCtr -> $a();

2) 提交代码

1 $  git add -A
2 $  git commit -m "自动加载类完成"

区分平台(前台,后台….)

优化进口文件

   思路

  达成基于平台的例外进行不相同的操作

  用户点击页面请求,随着url发送贰个参数: p=平台&c=控制器&a=动作
       入口文件吸收接纳get数据就足以知道:  平台, 控制器, 动作

  思路

  难题:
此时,入口文件代码零碎增多,随着后续代码的增多,入口文件会越加臃肿复杂,不易管理

  化解格局:
封装入口文件中的操作称为贰个类,这样只须求在进口文件调用类的主意即可

    创建Init.class.php类文件,放入到Frame中
         将进口文件全数操作封装成类方法
              loadClass() 设置自动加载函数
              autoload()自动加载类
              setConst()  定义常量
              dispatch()  前端分发器

  代码实现

1) 操作步骤:

亚洲必赢官网 26亚洲必赢官网 27

1)入口文件平台区分:
    step 1:  入口-登录页面提交的action="?p=Home&c=User&a=dlogin"

    step 2:  入口文件index.php  接收$_GET

    step 3:  登录判断成功跳转地址: $this->msg('登录成功!', '?p=Admin&c=Index&a=index',3);

2) 后台首页:
     step 1:   静态css,js,img文件放置 Public/Admin/

     step 2:   创建后台首页控制器类,
   index() 载入后台首页视图文件

     step 3:  View/Admin/Index/index.html 修正css等静态文件路

操作步骤思路

2)登录表单提交action=“?p=Home&c=User&a=dlogin”   
【App/View/Home/User/login.html】

亚洲必赢官网 28亚洲必赢官网 29

 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/plugins/layui/css/layui.css">
 7     <link rel="stylesheet" type="text/css" href="public/Home/css/style.css">
 8 </head>
 9 <body>
10 <div class="container">
11     <div class="content">
12         <form action="?p=Home&c=User&a=dlogin" class="layui-form" method="post">
13 。。。。。。。

登录表单form提交action修改

3) 入口文件分别平台 【index.php】

<?php
/**
 * 入口文件
 */

$p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台
$c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器
$a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作

require_once 'Frame/Db.class.php';  //数据库操作类
require_once 'Frame/BaseModel.class.php';  //基础模型类
require_once 'App/Model/UserModel.class.php';

require_once 'Frame/FactoryModel.class.php';//模型工厂类

require_once 'Frame/BaseController.class.php';  //基础控制器类
require_once 'App/Controller/'.$p.'/'.$c.'Controller.class.php';

$ctr = $c."Controller";
//实例化控制器
$userCtr = new $ctr();

$userCtr -> $a();

用户控制器登录操作,登录成功跳转到后台首页
【App/Controller/Home/UserController.class.php】

亚洲必赢官网 30亚洲必赢官网 31

 1 <?php
 2 /**
 3  * UserController.class.php 用户控制器
 4  */
 5 
 6 class UserController  extends  BaseController{
 7 。。。
 8 。。。
 9 。。。
10  /**
11      * 登录操作: 校验登录信息
12      */
13     public function dlogin()
14     {
15         //接收登录信息
16         $data = array();
17         $data['username'] = trim($_POST['username']);
18         $data['pwd'] = trim($_POST['pwd']);
19 
20         //实例化模型,调用模型方法
21         $result = FactoryModel::M('User')->checkLoginInfo($data);
22 
23         //跳转提示
24         if($result){
25             $this->msg('登录成功!', '?p=Admin&c=Index&a=index',3);
26         } else {
27             $this->msg('用户名或密码不正确!!');
28         }
29     }
30 }

签到操作成功后跳转路径修改

  代码完结

   1) 在Frame目录中创立Init.class.php文件,
将进口文件index中的代码复制进行改动为类

  【Frame/Init.class.php】

 1 <?php
 2 /**
 3  * 应用初始化操作类
 4  * User: young
 5  */
 6 
 7 class Init
 8 {
 9     protected static $frame = array('BaseController','BaseModel','Db','FactoryModel'); //Frame目录公共操作类
10     public static function run()
11     {
12         //平台
13         self::dispatch();
14 
15         //定义常量
16         self::setConst();
17 
18         //自动加载类
19         self::loadClass();
20 
21         $ctr = CTR."Controller";  //拼接控制器名称
22 
23         //实例化控制器
24         $ctrObj = new $ctr();
25         $a = ACTION;
26         $ctrObj -> $a();
27     }
28     /**
29      * 设置自动加载类方法
30      */
31     private static function loadClass()
32     {
33         spl_autoload_register('self::autoload');
34     }
35 
36     /**
37      * 实现自动加载
38      * @param  string $className 类名
39      */
40     private static function autoload($className)
41     {
42         $upperClassName = strtoupper($className);
43         if(in_array($className, static::$frame)) {
44             require_once FRAME."$className.class.php";
45         } elseif(substr($upperClassName, -5) == 'MODEL'){
46             require_once MODEL."$className.class.php";
47         } elseif(substr($upperClassName, -10) == 'CONTROLLER'){
48             require_once CTRONLLER."$className.class.php";
49         }
50     }
51 
52     /**
53      * 定义常量
54      */
55     private static function setConst()
56     {
57         define('DS', DIRECTORY_SEPARATOR); //目录分割符
58         define('ROOT', getcwd().DS);
59         define('FRAME', ROOT.'Frame'.DS);
60         define('APP', ROOT.'App'.DS);
61         define('PUB', ROOT.'Public'.DS);
62         define('ADMIN', PUB.'Admin'.DS);
63         define('HOME', PUB.'Home'.DS);
64 
65 
66         define('MODEL', APP.'Model'.DS);
67         define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS);
68         define('CTRONLLER', APP.'Controller'.DS.PLAT.DS);
69     }
70 
71     /**
72      * 获取 p c a 的GET值,并设置为常量
73      * @return void
74      */
75     private static function dispatch()
76     {
77         $p = !empty($_GET['p']) ? $_GET['p'] : 'Home';  //平台
78         $c = !empty($_GET['c']) ? $_GET['c'] : 'User';  //控制器
79         $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作
80 
81         define('PLAT', $p);
82         define('CTR', $c);
83         define('ACTION', $a);
84     }
85 }

2) 入口文件引入初叶化类,并调用其艺术 【index.php】

1 <?php
2 /**
3  * 入口文件
4  */
5 
6 require_once './Frame/Init.class.php';
7 Init::run();

3) 提交代码

1 $  git add -A
2 $  git commit -m "优化入口文件,封装初始化类"

  测试

 1)模板准备: 

     
准备后台湾电视机中心图模板程序。能够本人写前端视图模板程序,也得以到网上下载旁人写好的前端模板,如到
模板之家  选用所必要的 前台,后台模板 

      寻找模板:  www.mycodes.net

   2) 将后台模板视图的静态财富文件(如 js, css,image)拷贝到
【Public/admin/】目录下

   3) 创设后台首页控制器
【App/Controller/Admin/IndexController.class.php】

 1 <?php
 2 /**
 3  * IndexController控制器类
 4  * 后台相关操作
 5  * User: young
 6  */
 7 
 8 class IndexController extends BaseController
 9 {
10     //展示后台首页
11     public function index()
12     {
13         include 'App/View/Admin/Index/index.html';
14     }
15 }

4) 创建后台首页视图 【App/View/Admin/Index/index.html】

亚洲必赢官网 32亚洲必赢官网 33

  1 <!doctype html>
  2 <html>
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>后台管理</title>
  6     <link rel="stylesheet" type="text/css" href="./Public/Admin/css/common.css"/>
  7     <link rel="stylesheet" type="text/css" href="./Public/Admin/css/main.css"/>
  8     <script type="text/javascript" src="./Public/Admin/js/libs/modernizr.min.js"></script>
  9     <script type="text/javascript" src="./Public//home/js/jquery1.42.min.js"></script>
 10 </head>
 11 <body>
 12 
 13 
 14 <div class="topbar-wrap white">
 15     <div class="topbar-inner clearfix">
 16         <div class="topbar-logo-wrap clearfix">
 17             <h1 class="topbar-logo none"><a href="index.html" class="navbar-brand">后台管理</a></h1>
 18             <ul class="navbar-list clearfix">
 19                 <li><a class="on" href="?p=back">首页</a></li>
 20                 <li><a href="./" target="_blank">网站首页</a></li>
 21             </ul>
 22         </div>
 23         <div class="top-info-wrap">
 24             <ul class="top-info-list clearfix">
 25                 <li><a href="">user1</a></li>
 26                 <li><a href="?p=back&c=Index&a=ChangePswd">修改密码</a></li>
 27                 <li><a href="?c=User&a=Logout">退出</a></li>
 28             </ul>
 29         </div>
 30     </div>
 31 </div>
 32 <div class="container clearfix">
 33 
 34     <!--左侧菜单栏-->
 35 
 36     <!--左侧菜单栏 begin-->
 37     <div class="sidebar-wrap">
 38         <div class="sidebar-title">
 39             <h1>菜单</h1>
 40         </div>
 41         <div class="sidebar-content">
 42             <ul class="sidebar-list">
 43                 <li>
 44                     <a href="#"><i class="icon-font">&#xe003;</i>常用操作</a>
 45                     <ul class="sub-menu">
 46                         <li><a href="#"><i class="icon-font">&#xe008;</i>分类管理</a></li>
 47                         <li><a href="#"><i class="icon-font">&#xe005;</i>博文管理</a></li>
 48                         <li><a href="#"><i class="icon-font">&#xe012;</i>评论管理</a></li>
 49                         <li><a href="#"><i class="icon-font">&#xe052;</i>友情链接</a></li>
 50                     </ul>
 51                 </li>
 52                 <li>
 53                     <a href="#"><i class="icon-font">&#xe018;</i>系统管理</a>
 54                     <ul class="sub-menu">
 55                         <li><a href="#"><i class="icon-font">&#xe017;</i>系统设置</a></li>
 56                         <li><a href="#"><i class="icon-font">&#xe046;</i>数据备份</a></li>
 57                         <li><a href="#"><i class="icon-font">&#xe045;</i>数据还原</a></li>
 58                     </ul>
 59                 </li>
 60             </ul>
 61         </div>
 62     </div>
 63     <!--左侧菜单栏 begin-->
 64 
 65     <!--右侧主操作区-->
 66     <div class="main-wrap">
 67         <div class="crumb-wrap">
 68             <div class="crumb-list">
 69                 <i class="icon-font">&#xe06b;</i>
 70                 欢迎使用博客后台管理系统。
 71             </div>
 72         </div>
 73         <div class="result-wrap">
 74             <div class="result-title">
 75                 <h1>系统基本信息</h1>
 76             </div>
 77             <div class="result-content">
 78                 <ul class="sys-info-list">
 79                     <li>
 80                         <label class="res-lab">操作系统</label>WINNT
 81                     </li>
 82                     <li>
 83                         <label class="res-lab">运行环境</label>Apache/2.2.21 (Win64) PHP/5.3.10
 84                     </li>
 85                     <li>
 86                         <label class="res-lab">PHP运行方式</label>apache2handler
 87                     </li>
 88                     <li>
 89                         <label class="res-lab">模板版本</label>v-0.1
 90                     </li>
 91                     <li>
 92                         <label class="res-lab">上传附件限制</label>2M
 93                     </li>
 94                     <li>
 95                         <label class="res-lab">北京时间</label>
 96                         <?php echo date('Y年m月d日 H:i:s',time()); ?>
 97                     </li>
 98                     <li>
 99                         <label class="res-lab">服务器域名</label>localhost
100                     </li>
101                 </ul>
102             </div>
103         </div>
104     </div>
105     <!--/main-->
106     <script >
107         $(function(){
108             $("#nowtime").css({color:'red'});
109             $("#host").html(location.host);
110             window.setInterval('ShowTime()',1000);
111         });
112         function ShowTime(){
113             var t = new Date();
114             var str = t.getFullYear() + '年';
115             str += t.getMonth()+1 + '月';
116             str += t.getDate()-1 + '日 ';
117             str += t.getHours() + ':';
118             str += t.getMinutes() + ':';
119             str += t.getSeconds() + '';
120             $("#nowtime").html(str);
121         }
122     </script>
123 </div>
124 
125 </body>
126 </html>

后台首页视图

石嘴山访问项目目录

  效果及提交代码

亚洲必赢官网 34  代码提交,推送

1 $  git add -A
2 $  git commit -m "区分平台,实现后台首页"
3 $  git checkout master
4 $  git merge 'folder-model-app'
5 $  git push origin master

小结: 依据平台进一步优化目录结构,制作模型的单例工厂,达成后台首页

   思路

  难点:
此时,项目中保有目录都以足以经过浏览器访问的,如直接待上访问Frame/Db.class.php文件
直接能够去查看数据库登录音信,分明是不安全的。

  消除措施:

    格局1:
在可以访问的文本初叶处定义常量,访问是判定是或不是定义常量defined(..),
没有定义钦点常量则直接exit(‘Access Deny’);

    方式2: 开启分布式权限配置,编写.htaccess文件, 如禁止访问,
将该公文放置在取缔访问的目录中

建议难题

  1. 品种中得以看出
include或require的公文路径非常短,简单失误,也不便利使用  ==>
怎么着进一步简约引入且不易出错

     2. 写三个类,就要到进口文件引入贰次, 比较麻烦  ==> 
怎么着兑现活动加载类

  3. 乘胜类的引入扩张,入口文件代码量会愈加大  ==>  怎样封装,简化入口文件

  4. 现行反革命项目中任何三个索引,都能够随便走访  ==>
怎么着进步平安访问,限制目录的拜访

下一步:常量使用,自动加载类完结,入口封装,限制目录访问

   实现

  1)使用上述办法2的款型来促成,
站点配置中进入一项(环境搭建时一度投入了):
详细见:PHP源码搭建博客1-条件搭建

  apache配置文件httpd-vhosts.conf 中站点布局

1  #允许分布式权限配置(允许重写)(.htacess)
2   AllowOverride All

  2) 重启apache后,编写 .htaccess文件, 该文件内容:

deny from all

   3) 将.htaccess文件放置禁止访问的目录中。  如App/ ,  Frame/
目录下。只用放在第③层即可,内层目录自动不容许直接待上访问。

                               
亚洲必赢官网 35

  4) 访问测试

                   
亚洲必赢官网 36

小结:

要害落成了 引入路径优化, 类的电动加载, 封装优化进口文件,目录访问限制

MVC微型框架到此基本到位。其实还有不少还是能持续扩展,如

  1, 类文件命名此处都用了 .class.php结尾,
实质能够优化直接使用.php结尾

  2, 引入命名空间,更便于的加载类

       3, 项目中冒出谬误,此时是直接展现在浏览器上的,
能够写贰个日志类,发生错误写入文件或数据库都可

  4, 数据库连接新闻此处是直接写在DB类和BaseModel中了, 是不安全的。
能够创建2个配置目录,将这一个新闻写入配置文件,再写叁个加载配置文件的类。

  5.   此框架结构目录 ,是在C,V中分平台,如Controller/Home,
Controller/Admin;  实际也足以写成 平台下分MVC结构, 如Admin/Controller,
Admin/Model, Home/Controller,Home/View .. 
那些是相比灵敏的,能够依照需要选拔特别合适的格局

  实际上线项目,仍然建议采纳框架,安全连忙;
自身模仿定义的架构适合学习探讨利用,不难遗漏,造成安全隐患,操作困难等题材

下一步:依照博客前端模板,分析成立数据表,
起首搭建博客后台程序,后续首先准备达成“分类模块”。既分类的显得,修改,添加,删除成效

网站地图xml地图