這是一個最小化的Php mvc項目,如下經過對項目結構的分析,說明php中搭建mvc框架的最基本思路。php
目錄結構以下:html
/application 應用程序目錄mysql
/model 模型類目錄web
/view 視圖類目錄sql
/controller 控制器類目錄數據庫
/framework 框架代碼目錄mvc
/Model.class.php 基礎模型類app
/MySQLDB.class.php 數據庫的操做類框架
/index.php 入口文件fetch
項目文件結構圖以下:
mysql數據庫操做類,構造方法中初始化了相關的參數,數據庫鏈接等。同時在該類中並封裝link(),selectDB(),query(),fetchAll(),fetchRow()等操做數據庫的基本方法(後續可作進一步擴展)。
/**
* 構造方法
*
* @param $params array 須要初始化的數據集合!
*/
public function __construct($params=array()) {
$this->host = isset($params['host']) ? $params['host'] : '127.0.0.1';
$this->port = isset($params['port']) ? $params['port'] : '3306';
$this->user = isset($params['user']) ? $params['user'] : 'root';
$this->pass = isset($params['pass']) ? $params['pass'] : '';
$this->charset = isset($params['charset']) ? $params['charset'] : 'utf8';
//若是默認數據庫爲空字符串,表示用戶沒有選擇默認數據,意味着不須要執行use dbname!
$this->dbname = isset($params['dbname']) ? $params['dbname'] : '';
//鏈接數據庫
$this->link();
//設置字符集
$this->setCharset();
//選擇默認數據庫
$this->selectDB();
}
基礎模型類:全部模型類的基類,構造方法中初始化MySQLDB類的對象,並賦值給成員$db
<?php
/**
* 基礎模型類
*/
class Model {
protected $db;//初始化MySQLDB類的對象
public function __construct() {
//初始化數據庫操做對象
$this->initDB();
}
protected function initDB() {
//引入mysqldb類
require './framework/MySQLDB.class.php';
//實例化對象
$this->db = new MySQLDB(array('pass'=>'1234abcd', 'dbname'=>'itcast'));
}
}
該文件夾包含如下模型類文件:
MatchModel.class.php
StudentModel.class.php
以StudentModel爲例,提供了getList()方法,返回全部學生數據。(方法可按須要擴展)
因爲繼承自Model類,而基礎的功能在MySQLDB類和Model類中已作了封裝,所以這裏的查詢代碼很是簡潔。
<?php
require './framework/Model.class.php';
class StudentModel extends Model {
public function getList() {
return $this->db->fetchAll('select * from student');
}
}
該文件夾包含如下視圖文件:
match_list.html
student_list.html
以student_list.html爲例,將$list中的數據進行展現,php代碼主要是展現數據的須要,不處理業務邏輯。
這裏的代碼是做爲模版(template),由控制器須要時進行調用的。
<h1>學生列表</h1>
<?php foreach($list as $row) :?>
<?php echo $row['stu_name'];?>,
<?php echo $row['gender'];?>,
<br>
<?php endForeach;?>
該文件夾包含如下控制器類文件:
MatchController.class.php
StudentController.class.php
以StudentController爲例,提供了相關Action的方法。如listAction()經過載入StudentModel.class.php文件,建立StudentModel類的對象來操做數據庫,獲得學生信息。而後調用學生列表視圖模版,展現頁面。
控制器類中的方法是提供給入口文件(Index.php)調用的,由於全部的請求都是向單一的入口文件Index.php發起。
<?php
class StudentController {
public function listAction() {
//載入學生模型
require './application/model/StudentModel.class.php';
$model_student = new StudentModel;
//獲得學生列表數據
$list = $model_student->getList();
//調用一個學生列表視圖模板,展現頁面
require './application/view/student_list.html';
}
}
單一入口文件:根據請求參數,建立控制器對象,執行所請求的Action對應的方法.
<?php
/**
*入口文件
*/
//根據請求c參數,肯定當前的控制器類標識
$c = isset($_GET['c']) ? $_GET['c'] : 'Match';
//載入控制器類文件,獲得控制器類對象
$controller_name = $c . 'Controller';
require './application/controller/' . $controller_name . '.class.php';
$controller = new $controller_name;//可變類名
//根據請求a參數,肯定當前的Action標識
$a = isset($_GET['a']) ? $_GET['a'] : 'list';
//獲得當前的方法
$action_name = $a . 'Action';//拼湊方法名
//調用
$controller->$action_name();//可變方法名