这是一个最小化的Php mvc项目,以下通过对项目结构的分析,说明php中搭建mvc框架的最基本思路。
1.MVC项目结构
目录结构如下:
/application 应用程序目录
/model 模型类目录
/view 视图类目录
/controller 控制器类目录
/framework 框架代码目录
/Model.class.php 基础模型类
/MySQLDB.class.php 数据库的操作类
/index.php 入口文件
项目文件结构图如下:
2.framework (基础框架目录)
2.1 MySQLDB.class.php
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();
}
2.2 Model.class.php
基础模型类:所有模型类的基类,构造方法中初始化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\'));
}
}
3.application (应用程序目录)
3.1 Model 模型
该文件夹包含以下模型类文件:
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\');
}
}
3.2 View 视图
该文件夹包含以下视图文件:
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;?>
3.3 Contrllor 控制器
该文件夹包含以下控制器类文件:
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\';
}
}
4.Index.php (单一入口文件)
单一入口文件:根据请求参数,创建控制器对象,执行所请求的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();//可变方法名