这是一个最小化的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();//可变方法名