該項(xiàng)目文件結(jié)構(gòu)簡單,根據(jù)MVC設(shè)計(jì)思想,使用函數(shù)式編程,未使用類和面向?qū)ο缶幊?,簡化框架結(jié)構(gòu),輕量展示MVC編程結(jié)構(gòu)。使用原生php,實(shí)現(xiàn)注冊、登錄和筆記列表展示,可以加深session cookie工作原理的理解。
項(xiàng)目源碼:https://github.com/onerole1024/functionmvc.git

index.php 是入口文件
引入使用mvc結(jié)構(gòu)的函數(shù)和工具【公共】函數(shù),并接收參入的參數(shù)c和a代表請求的控制器和動作方法,然后調(diào)用make函數(shù)調(diào)用控制器下的某個控制器中的某個方法處理這次請求。
<?php
include_once ('mvc.php');
include_once ('tool.php');
session_start();
if(isset($_GET['c']) && $_GET['c']){
$control = $_GET['c'];
unset($_GET['c']);
}else{
$control ='welcome';
}
if(isset($_GET['a']) && $_GET['a']){
$action = $_GET['a'];
unset($_GET['a']);
}else{
$action ='index';
}
try{
make($control,$action);
}catch(Exception $e){
make('error','index',array('except'=>$e));
}
?>
controls文件夾包含了所有控制器,welcome.php是默認(rèn)控制器,該控制器只有一個index方法,只設(shè)置了下頁面title,然后調(diào)用show方法,渲染views目錄下的視圖。
<?php
function index($control,$data){
$data['pageTitle'] = '歡迎';
show($control.'/index',$data);
}
?>
views文件夾里面都是視圖文件,文件夾的命名為控制器的名稱,方便管理。如何將控制器中的變量渲染到視圖文件使用了一個函數(shù)extract($data);以下是welcome.php控制器中index方法渲染的視圖文件index.php
歡迎來學(xué)習(xí)這個小小記事本項(xiàng)目,<?php echo url('./?c=user&a=reg','注冊');?>之后才可以查看自己的記事本<br/>
已有賬戶,<?php echo url('./?c=user&a=login','登錄');?>查看
視圖的頭部和腳部都不在每個視圖文件中,而在layout文件夾中,只要一前一后include 進(jìn)來就可以實(shí)現(xiàn)將每個頁面公共一樣的部分提取出來,方便管理。
welcome.php控制器中沒什么邏輯處理,但像user.php或者article.php控制器,需要對數(shù)據(jù)庫進(jìn)行操作,我們借助models文件夾下的相應(yīng)model來實(shí)現(xiàn)具體數(shù)據(jù)庫操作。例如article.php,我們使用mvc.php文件中的data方法實(shí)現(xiàn)db.php數(shù)據(jù)庫連接函數(shù)文件引入和models下相應(yīng)model文件引入。
function data($model){
require_once ('db.php');
$url = './models/'.$model.'.php';
if (file_exists($url)) {
include ($url);
}else{
throw new Exception('找不到該模型',404);
}
}
<?php
function arlists($uid){
$conn = db_connect();
$result = $conn->query("select * from article where uid=".$uid);
if (!$result) {
return false;
}
$articles = array();
while ($row = $result->fetch_assoc()) {
$articles[] =$row;
}
$conn->close();
return $articles;
}
?>
采用try catch 捕獲異常,錯誤手動拋出異?!?throw new Exception('連接不上數(shù)據(jù)庫');】,在入口文件中進(jìn)行異常捕獲,渲染錯誤頁面,列出錯誤信息
try{
make($control,$action);
}catch(Exception $e){
make('error','index',array('except'=>$e));
}
錯誤碼:<?php echo $except->getCode();?><br/>
錯誤信息:<?php echo $except->getMessage();?><br/>
錯誤文件:<?php echo $except->getFile();?><br/>
錯誤行:<?php echo $except->getLine();?>
這個mvc登錄小項(xiàng)目包含的數(shù)據(jù)庫結(jié)構(gòu)如下
create database login DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
use login;
create table user (
`uid` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(16) NOT NULL,
`password` char(60) NOT NULL,
`email` varchar(100) DEFAULT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='用戶表';
create table article (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
`content` text DEFAULT NULL,
`createtime` int(11) DEFAULT NULL,
`updatetime` int(11) DEFAULT NULL,
`uid` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='文章表';
-- 創(chuàng)建名為freeuser的用戶,%表示可以遠(yuǎn)程操作,ip不限。
CREATE USER 'freeuser'@'%' IDENTIFIED BY 'free99';
-- 分配login庫的所有權(quán)限給freeuser用戶
GRANT ALL PRIVILEGES ON login.* TO 'freeuser'@'%';