当前位置:首页 > PHP

php实现mvc框架

2026-01-29 03:05:23PHP

理解MVC架构

MVC(Model-View-Controller)是一种设计模式,将应用程序分为三个核心组件:模型(Model)处理数据和业务逻辑,视图(View)负责展示数据,控制器(Controller)接收用户输入并协调模型和视图。

目录结构设计

典型的MVC框架目录结构如下:

app/
    controllers/
    models/
    views/
public/
    index.php
    assets/
core/
    Router.php
    Database.php
    Controller.php
    Model.php

实现核心组件

路由(Router)
路由解析URL并调用对应的控制器和方法:

class Router {
    public static function route($url) {
        $urlParts = explode('/', trim($url, '/'));
        $controllerName = isset($urlParts[0]) ? ucfirst($urlParts[0]) . 'Controller' : 'HomeController';
        $action = isset($urlParts[1]) ? $urlParts[1] : 'index';

        if (class_exists($controllerName)) {
            $controller = new $controllerName();
            if (method_exists($controller, $action)) {
                call_user_func_array([$controller, $action], array_slice($urlParts, 2));
            } else {
                throw new Exception("Method $action not found");
            }
        } else {
            throw new Exception("Controller $controllerName not found");
        }
    }
}

基础控制器
提供视图渲染和公共方法:

class Controller {
    protected function render($view, $data = []) {
        extract($data);
        require_once "../app/views/$view.php";
    }
}

基础模型
封装数据库操作:

class Model {
    protected $db;

    public function __construct() {
        $this->db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    }
}

入口文件配置

public/index.php 作为单一入口:

require_once '../core/Router.php';
$url = isset($_GET['url']) ? $_GET['url'] : '';
Router::route($url);

示例控制器实现

class UserController extends Controller {
    public function index() {
        $userModel = new UserModel();
        $users = $userModel->getAllUsers();
        $this->render('user/index', ['users' => $users]);
    }
}

示例模型实现

class UserModel extends Model {
    public function getAllUsers() {
        $stmt = $this->db->query("SELECT * FROM users");
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}

视图文件示例

app/views/user/index.php

<!DOCTYPE html>
<html>
<body>
    <?php foreach ($users as $user): ?>
        <p><?= htmlspecialchars($user['name']) ?></p>
    <?php endforeach ?>
</body>
</html>

自动加载类

使用spl_autoload_register避免手动包含文件:

spl_autoload_register(function ($className) {
    $paths = [
        '../app/controllers/',
        '../app/models/',
        '../core/'
    ];

    foreach ($paths as $path) {
        $file = $path . $className . '.php';
        if (file_exists($file)) {
            require_once $file;
        }
    }
});

数据库配置分离

建议将数据库配置放在单独文件(如config/database.php):

return [
    'host' => 'localhost',
    'dbname' => 'test',
    'username' => 'root',
    'password' => ''
];

错误处理

添加基本错误处理机制:

php实现mvc框架

set_exception_handler(function ($e) {
    echo "Error: " . $e->getMessage();
});

扩展建议

  • 添加中间件支持
  • 实现依赖注入容器
  • 增加模板引擎集成
  • 添加RESTful路由支持
  • 实现ORM功能

通过以上步骤可以构建一个基础的PHP MVC框架,实际项目中可根据需求进一步扩展功能。

标签: 框架php
分享给朋友:

相关文章

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

php实现文件下载

php实现文件下载

PHP实现文件下载的方法 通过PHP实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开: $fi…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素(不移除…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_shi…

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $db…

php 路由实现

php 路由实现

PHP 路由实现方法 在 PHP 中实现路由功能有多种方式,以下是几种常见的实现方法: 使用原生 PHP 实现 通过解析 URL 并匹配对应的控制器和动作: $request = $_SERVER…