当前位置:首页 > PHP

php 实现mvc

2026-04-02 21:37:34PHP

在 PHP 中实现 MVC(Model-View-Controller)架构可以通过以下方式完成。MVC 将应用程序分为三个核心组件:模型(数据处理)、视图(用户界面)和控制器(业务逻辑)。以下是具体实现步骤:

项目目录结构

典型的 MVC 项目目录结构如下:

project/
├── app/
│   ├── controllers/
│   ├── models/
│   ├── views/
│   └── core/ (可选,存放核心类)
├── public/
│   └── index.php (入口文件)
└── vendor/ (Composer 依赖)

入口文件 (public/index.php)

入口文件负责初始化应用程序并路由请求:

<?php
require_once '../app/bootstrap.php'; // 初始化配置
$app = new Core\App();
$app->run();

核心类 (app/core/App.php)

核心类处理路由和调度:

namespace Core;

class App {
    protected $controller = 'Home';
    protected $method = 'index';
    protected $params = [];

    public function __construct() {
        $url = $this->parseUrl();

        // 控制器逻辑
        if (file_exists('../app/controllers/' . ucfirst($url[0]) . 'Controller.php')) {
            $this->controller = ucfirst($url[0]);
            unset($url[0]);
        }

        require_once '../app/controllers/' . $this->controller . 'Controller.php';
        $this->controller = new $this->controller;

        // 方法逻辑
        if (isset($url[1])) {
            if (method_exists($this->controller, $url[1])) {
                $this->method = $url[1];
                unset($url[1]);
            }
        }

        // 参数处理
        $this->params = $url ? array_values($url) : [];
        call_user_func_array([$this->controller, $this->method], $this->params);
    }

    protected function parseUrl() {
        if (isset($_GET['url'])) {
            return explode('/', filter_var(rtrim($_GET['url'], '/'), FILTER_SANITIZE_URL));
        }
        return ['home'];
    }
}

控制器示例 (app/controllers/HomeController.php)

控制器处理业务逻辑并调用模型和视图:

namespace App\Controllers;

use Core\Controller;
use App\Models\Post;

class HomeController extends Controller {
    public function index() {
        $posts = Post::getAll();
        $this->view('home/index', ['posts' => $posts]);
    }
}

模型示例 (app/models/Post.php)

模型负责数据操作:

namespace App\Models;

use Core\Model;
use PDO;

class Post extends Model {
    public static function getAll() {
        $db = static::getDB();
        $stmt = $db->query('SELECT * FROM posts');
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}

视图示例 (app/views/home/index.php)

视图负责展示数据:

<!DOCTYPE html>
<html>
<head>
    <title>Posts</title>
</head>
<body>
    <?php foreach ($posts as $post): ?>
        <h1><?= htmlspecialchars($post['title']) ?></h1>
    <?php endforeach; ?>
</body>
</html>

数据库连接 (app/core/Model.php)

基础模型类处理数据库连接:

namespace Core;

use PDO;

class Model {
    protected static function getDB() {
        static $db = null;
        if ($db === null) {
            $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8';
            $db = new PDO($dsn, DB_USER, DB_PASS);
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        return $db;
    }
}

自动加载与配置

使用 Composer 的 PSR-4 自动加载(composer.json):

{
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    }
}

配置文件 (app/config.php) 定义常量如数据库连接信息。

路由改进(可选)

使用第三方库如 nikic/FastRoute 实现更灵活的路由:

php 实现mvc

$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
    $r->addRoute('GET', '/posts', 'PostController@index');
});

通过以上步骤,可以构建一个基础的 PHP MVC 框架。实际项目中可能需要添加中间件、依赖注入等高级功能。

标签: phpmvc
分享给朋友:

相关文章

php实现文件下载

php实现文件下载

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

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class Tr…

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 //…

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'localh…

php验证码实现

php验证码实现

验证码实现方法 在PHP中实现验证码功能通常涉及生成随机字符串或数字,将其转换为图像,并通过会话(Session)进行验证。以下是几种常见的实现方式: 使用GD库生成图像验证码 GD库是PHP内置的…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…