当前位置:首页 > 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 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Session 是…

php实现即时通讯

php实现即时通讯

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

php 队列的实现

php 队列的实现

PHP 队列的实现方法 使用数据库实现队列 创建一个数据表存储队列任务,包含任务ID、状态、创建时间等字段。通过SQL语句实现任务的入队和出队操作。 // 入队操作 INSERT INTO queu…

php session 实现购物车

php session 实现购物车

PHP Session 实现购物车的方法 初始化 Session 在 PHP 脚本的最开始调用 session_start() 函数,确保会话已启用。这通常在页面的顶部完成。 session_sta…

php 实现长轮询

php 实现长轮询

PHP 实现长轮询的方法 长轮询(Long Polling)是一种服务器推送技术,客户端发送请求后,服务器保持连接开放直到有新数据或超时。以下是实现步骤: 基础实现代码 创建一个简单的长轮询 PHP…