PHP架构模式:从MVC到CQRS

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么架构决定一切(你的咖啡再也不会凉了)

\n

想象一下你在盖房子。你可以随意堆砌砖块,用口香糖粘合,指望它能撑到冬天。但也可以精心设计地基、墙壁和屋顶,让房子能抵御飓风和亲戚的突然造访。在PHP的世界里,道理完全相同。架构模式就是那些蓝图,能将你的代码从“能用就行”转变为“运行良好、可扩展、不会让人想喝碘酒”。

\n

当我刚开始用PHP编码时,我的项目都是庞大的单体应用。在同一个index.php文件里,SQL查询、HTML布局和业务逻辑挤在一起。这种写法一直能工作,直到客户要求添加新功能。然后就是地狱般的日子。今天,我将向你们展示如何避免这种地狱。我们将剖析PHP中的关键架构模式——从经典到现代方法。开始吧!

\n\n

MVC(模型-视图-控制器):所有模式之祖

\n

如果你用过Laravel、Symfony或Yii2,你一定遇到过MVC。这是PHP的基础架构模式,它将应用分为三部分:

\n
    \n
  • Model(模型) — 数据和业务逻辑(数据库操作、验证、计算)。
  • \n
  • View(视图) — 显示(HTML、模板、JSON)。
  • \n
  • Controller(控制器) — 纽带:接收请求,调用模型,并将数据传递给视图。
  • \n
\n

MVC解决了主要问题——职责分离。HTML中再也不会有SQL。代码变得可读、可测试、可维护。

\n\n

纯PHP的MVC示例

\n
// Model: User.php\nclass User {\n    public function find(int $id): ?array {\n        $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');\n        $stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');\n        $stmt->execute([$id]);\n        return $stmt->fetch() ?: null;\n    }\n}\n\n// Controller: UserController.php\nclass UserController {\n    public function show(int $id): void {\n        $userModel = new User();\n        $user = $userModel->find($id);\n        if (!$user) {\n            http_response_code(404);\n            echo '用户未找到';\n            return;\n        }\n        // 将数据传递给视图\n        require 'views/user.php';\n    }\n}\n\n// View: views/user.php\n<h1><?= htmlspecialchars($user['name']) ?></h1>\n<p>邮箱: <?= htmlspecialchars($user['email']) ?></p>
\n

何时使用:适用于中等复杂度的Web应用。如果你有一个简单的博客或电商网站,MVC是你的选择。但要小心:如果控制器变得臃肿(Fat Controllers),模式就失去了意义。

\n\n

Active Record:简单与速度

\n

Active Record模式是指对象同时代表数据库中的一行和业务逻辑。还记得Laravel Eloquent或Yii2 ActiveRecord吗?就是它。每个模型既是数据库查询,又是验证规则和关联关系。

\n\n

Active Record示例(Eloquent风格)

\n
class User extends ActiveRecord {\n    // 属性对应表的列\n    public int $id;\n    public string $name;\n    public string $email;\n\n    public function save(): bool {\n        // INSERT/UPDATE逻辑\n        if ($this->id) {\n            // UPDATE\n        } else {\n            // INSERT\n        }\n        return true;\n    }\n\n    public static function find(int $id): ?self {\n        // SELECT * FROM users WHERE id = $id\n    }\n}\n\n// 使用\n$user = new User();\n$user->name = '伊万';\n$user->email = 'ivan@example.com';\n$user->save(); // 简单明了
\n

优点:编写速度快,对新手直观易懂。缺点:违反了单一职责原则(SOLID中的Single Responsibility)。模型既了解数据,又知道如何保存数据。对于复杂的项

博客

书籍推荐