在构建Web应用程序时,MVC(模型-视图-控制器)模式是一种常见的设计模式,它有助于将应用程序的业务逻辑、数据和用户界面分离开来。本文将介绍如何使用PHP创建一个简单的MVC框架。
首先,来定义一下MVC模式的三个主要组成部分:
在.NET中,创建控制器和视图非常简单,只需点击新建控制器,然后选择创建视图,就会得到一个非常简洁的控制器代码。但在互联网上,大多数网站都是基于PHP/MySQL构建的,对于一个街角的面包店来说,引入Zend或其他大型MVC框架可能有些过于复杂。因此,希望创建一个简单的PHP MVC模型,其中控制器类可以像.NET中的那样简单。
在PHP中,可以选择多种模板引擎。在本文介绍的模型中,可以轻松地插入任何喜欢的模板引擎。选择了Smarty,这是一个非常流行的PHP模板引擎。
首先需要设置一个.ini文件,其中包含一些重要的设置。然后,index.php文件应该首先解析这个文件。
[settings]
controller_path="controllers/"
view_path="views/"
baseURL="/subdir"
接下来,需要修改.htaccess文件,以确保所有请求都通过一个单一的源进行路由。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(\.css|\.js|\.jpg|\.jpeg|\.png|\.gif|\.flv|\.swf)$
RewriteRule ^.*$ index.php
注意例外列表。不希望将CSS路由到控制器。尽管这可能是将.sass或.less文件转换为.css的地方。
同样,对于压缩的JavaScript文件或优化的图像也是如此。
接下来,需要创建一个抽象的Controller类。所有的控制器都将继承自这个类。Controller类需要做几件事情:
构造函数的实现如下:
<?php
require_once('libs/Smarty.class.php');
$config = parse_ini_file("config.ini", TRUE);
if (isset($_SERVER['REQUEST_URI']) && isset($_SERVER['REQUEST_METHOD'])) {
$requestData = '';
$method = $_SERVER['REQUEST_METHOD'];
if (isset($_SERVER['CONTENT_LENGTH']) && $_SERVER['CONTENT_LENGTH'] > 0) {
$httpContent = fopen('php://input', 'r');
while ($data = fread($httpContent, 1024)) {
$requestData .= $data;
}
fclose($httpContent);
}
$urlString = substr($_SERVER['REQUEST_URI'], strlen($config['settings']['baseURL']));
$urlParts = explode('/', $urlString);
if (isset($urlParts[0]) && $urlParts[0] == '') {
array_shift($urlParts);
}
if (!isset($urlParts[0]) || $urlParts[0] == '') {
$mainViewPath = "home/";
$currentController = "HomeController";
$controllerFile = "homeController.php";
} else {
$mainViewPath = strtolower($urlParts[0]);
$currentController = ucfirst($urlParts[0]) . "Controller";
$controllerFile = $urlParts[0] . "Controller.php";
array_shift($urlParts);
}
}
?>
现在知道了想要启动的控制器类。如果有人给发送了请求URL/products,希望加载productsController.php并创建一个ProductsController的实例。但首先需要关注创建一个抽象的Controller类。
接下来,需要创建视图和控制器,但首先会提醒.ini文件中包含的controller_path和view_path。这决定了文件结构:
baseURL
classes
Controller.php
Smarty.class.php
controllers
homeController.php
views
home
index.html
.htaccess
config.ini
index.php
最后,创建HomeController和home/index.html。
<?php
/*
@class HomeControlelr
@extends Controller
@description 这是首页的控制器
*/
class HomeController extends Controller {
public function index() {
$this->viewBag->hellomessage = "Hello world!";
return $this->View();
}
}
?>
和
<html>
<head>
<title>Index</title>
</head>
<body>
<h1>{$hellomessage}</h1>
</body>
</html>
基本上就是这样。虽然这需要更多的细节才能在实际生活中使用,但相信它展示了可以用PHP创建一个简单的MVC。对于小网站来说,这几乎已经足够了。