搭建自己的 PHP MVC 框架非常有意义,它不仅可以让我们更好地理解 MVC 设计模式,还可以帮助我们更好地学习和掌握 PHP 技术栈。下面,我将详细讲解如何搭建自己的 PHP MVC 框架,包括以下步骤。
一、搭建框架目录结构
首先,我们需要搭建一个合适的目录结构。建议按照 MVC 设计模式的要求,将代码分为 Model、View 和 Controller 三个部分,同时还包括公共库和配置文件等内容。具体的目录结构如下:
app
|-- config
| |-- config.php
|-- controller
| |-- IndexController.php
|-- model
| |-- UserModel.php
|-- view
| |-- index
| | |-- index.php
| |-- layout
| | |-- header.php
| | |-- footer.php
|-- system
| |-- core.php
| |-- router.php
|-- index.php
目录结构比较简单,主要包括配置、控制器、模型、视图、系统核心和路由等内容,其中控制器、模型和视图都是按照功能、模块或页面等进行分类,可根据实际情况进行调整。
二、编写系统配置文件
在 app/config 目录下,我们需要编写系统配置文件 config.php,包括数据库配置、常量定义、时区设置和错误提示信息等内容。可以参考以下代码:
<?php
define('BASE_URL', '/');
define('DB_HOST', 'localhost');
define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DEFAULT_CONTROLLER', 'index');
define('DEFAULT_ACTION', 'index');
define('ERROR_REPORTING', E_ALL);
define('TIMEZONE', 'Asia/Shanghai');
date_default_timezone_set(TIMEZONE);
error_reporting(ERROR_REPORTING);
系统配置文件主要定义了一些常量,如数据库的连接参数、URL 的基础路径、默认的控制器和动作名称、时区设置和错误提示信息等。这些参数可以根据实际情况进行调整。
三、编写系统核心文件
在 app/system 目录下,我们需要编写系统核心文件 core.php,用于处理框架的初始化、路由解析、控制器和动作的执行,还包括模型和视图的加载等功能。可以参考以下代码:
<?php
class Core {
public function __construct() {
$this->_init();
$this->_autoload();
$this->_router();
$this->_dispatch();
}
protected function _init() {}
protected function _autoload() {
spl_autoload_register(function($className) {
$classFile = str_replace('\\', DIRECTORY_SEPARATOR, $className) . '.php';
$classPath = APP_PATH . DIRECTORY_SEPARATOR . $classFile;
if (file_exists($classPath)) {
require_once $classPath;
}
});
}
protected function _router() {
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$path = rtrim(str_replace(BASE_URL, '', $path), '/');
$routes = explode('/', $path);
$this->controller = isset($routes[0]) && $routes[0] ? $routes[0] : DEFAULT_CONTROLLER;
$this->action = isset($routes[1]) && $routes[1] ? $routes[1] : DEFAULT_ACTION;
$this->params = array_slice($routes, 2);
}
protected function _dispatch() {
$controllerName = ucfirst($this->controller) . 'Controller';
$actionName = strtolower($this->action) . 'Action';
if (!class_exists($controllerName)) {
die('Controller not found: ' . $controllerName);
}
$controller = new $controllerName;
if (!method_exists($controller, $actionName)) {
die('Action not found: ' . $actionName);
}
call_user_func_array([$controller, $actionName], $this->params);
}
}
系统核心文件主要包括以下功能:
- 初始化:执行一些系统初始化操作;
- 自动加载:使用 spl_autoload_register 函数注册自动加载器,实现类的自动加载;
- 路由解析:解析当前请求的 URL,获取控制器和动作名称;
- 分发处理:根据解析的结果实例化控制器,并调用相应的动作方法执行,同时将 URL 中的参数传递给动作方法;
四、编写路由文件
在 app/system 目录下,还需要编写路由文件 router.php,用于对路由进行更加细粒度的处理,可以根据项目需要进行选择。参考以下示例代码:
$router = new Router();
$router->add('/:controller/:action', function($controller, $action) {
return ['controller' => $controller, 'action' => $action];
});
$router->add('/:controller/:action/:id', function($controller, $action, $id) {
return ['controller' => $controller, 'action' => $action, 'id' => $id];
});
return $router;
路由文件主要通过自定义的路由规则对请求进行匹配,并返回相应的参数数组,如 '/:controller/:action' 表示将 URL 中的第一个和第二个参数作为控制器和动作名称,'/controller/action/id' 表示将 URL 中的前三个参数作为控制器、动作和 ID,个数不限。路由启用的方法可以在系统核心文件 core.php 中的 _router() 方法中调用,在需要时进行调整。
五、编写控制器、模型和视图
在 app/controller、app/model 和 app/view 目录下,我们需要分别编写控制器、模型和视图文件,具体可以根据实际需求进行调整。以下是一个简单的示例控制器 IndexController 的代码:
<?php
class IndexController {
public function indexAction() {
$userModel = new UserModel();
$users = $userModel->findAll();
include APP_PATH . '/view/index/index.php';
}
}
在控制器中,我们可以调用模型的方法获取数据,再将数据传递给视图进行渲染。以下是一个简单的示例模型 UserModel 的代码:
<?php
class UserModel {
public function __construct() {
$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8mb4';
$this->_pdo = new PDO($dsn, DB_USER, DB_PASS);
}
public function findAll() {
$stmt = $this->_pdo->query('SELECT * FROM `user`');
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
在模型中,我们可以使用 PDO 连接数据库,并实现一些常用的数据查询和操作方法。以下是一个简单的示例视图 app/view/index/index.php 的代码:
<?php
include APP_PATH . '/view/layout/header.php';
?>
<ul>
<?php foreach ($users as $user): ?>
<li>#<?php echo $user['id']; ?> <?php echo $user['name']; ?></li>
<?php endforeach; ?>
</ul>
<?php
include APP_PATH . '/view/layout/footer.php';
在视图中,我们可以使用 PHP 将数据进行渲染并输出 HTML 页面,还可以包含其他的布局文件和公共模板等内容。
六、编写入口文件
最后,在 app 目录下我们需要编写一个入口文件 index.php,用于启动整个框架,将请求分发到系统核心文件 core.php 中进行处理。以下是一个简单的示例代码:
<?php
define('APP_PATH', realpath(__DIR__));
define('BASE_URL', '/');
require_once APP_PATH . '/config/config.php';
require_once APP_PATH . '/system/core.php';
new Core();
入口文件主要包括以下内容:
- 定义 APP_PATH 常量,指定当前应用的根目录;
- 定义 BASE_URL 常量,用于指定网站的基础路径;
- 引入系统配置文件 config.php;
- 引入系统核心文件 core.php;
- 实例化 Core 类,启动框架;
基本上,我们的 PHP MVC 框架就搭建完毕了。我们可以通过访问 URL 来测试各个部分的功能,如 http://localhost:8080/index/index/index 等。如果有特殊需求,我们还可以根据实际情况对框架进行调整和扩展。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:搭建自己的PHP MVC框架详解 - Python技术站