PHP MVC - 这是正确的结构吗?

PHP MVC - Is this the right structure?

我在理解 php 中的 mvc 时遇到一些问题。

我的文件夹结构如下所示:

controller
|- member.php
model
|- member.php
view
|- overview.php

我的代码如下所示:

控制器 > member.php

include '../model/member.php';

class Member{
    public function create_table_of_all_members(){
        $model = new Member();

        $members = $model->get_all_members();

        foreach ($members as $member) {
            echo $member;
        }
    }

    public function create_form(){

    }
}

型号 > member.php

class Member{
    public function __construct()
     {
        // DB-Connection initialization
     }

    function getAllMembers(){
        $sql = "";
        return $result;
    }
}

查看 > overview.php

include '../controller/member.php';

$controller = new Member();
$controller->create_table_of_all_members();

我走的路对吗?在视图文件夹中,我会放置例如概览(所有带有表格的页面)、表格(所有带有表格的页面)..

在像这样的概念性讨论中,很难界定什么是对的,什么是错的。我能给你的只是我自己有限的经验和意见。用你自己的意见吸收它,并根据你自己的意见决定什么是最适合你的。构建您的第一个架构,实施您的第一个项目,然后您自己的项目将开始告诉您您的架构是否适合您。这里有一些个人提示。


  • 从不从除VIEW之外的任何层向浏览器输出任何内容。

也就是说,如果您正在转向 MVC 模型,请尝试保持服务器与单个层的响应之间的连接,这似乎是 VIEW 层的完美工作,它处理来自和用户所看到的(用户界面)。


  • 学习额外的设计模式以完成您的架构

在我看来,MVC 并不是一个完全有效的 concept/archtecture。也就是说,它完美地定义了 关键职责 ,但没有定义如何使一切正常工作。例如,您将如何定义您的模型?你可以选择 Active Record (like your code represents) or you can opt out for DAO (Data Access Object)。简而言之,差异是这样的:

class ActiveRecordModel {
    protected function connect();
    protected function create();
    protected function update();
    protected function delete();
}

class Car extends ActiveRecordModel {
    public $id;
    public $maker;
    public $model;
    public $year;
}

这样,您可以使用 $myCar->create();,模型将在数据库中创建。相对于 DAO

class Car {
    private $id;
    private $maker;
    private $model;
    private $year;

    // Getters, Setters, Constructor
}

class CarDAO {
    public function add(Car $obj){
         // Establish connection here or at the constructor
         // Take data from $obj and arrange it to be stored.
    }
}

  • 控制器控制器交谈,但只有一个模型

我通常更喜欢为每个模型制作一个控制器,并且该控制器将知道如何处理该模型(无论模型使用哪种设计模式)。话虽如此,我避免在一个控制器中使用超过 1 个模型。如果您需要从不属于您自己的模型访问数据,请与它的控制器交谈,而不是绕过控制器并直接访问模型。这就是我的意思:

class AccountController extends GenericController {
     public function add($name, $phone, $birthday, $email, $password) {
          $accountModel = new Account();
          $accountModel->name = $name;
          $accountModel->phone = $phone;
          $accountModel->birthday = $birthday;
          $accountModel->password = $password;
          $id = $accountModel->insert();

          $emailController = new EmailController();
          $emailController->add($email, $id);
          // Here, instead of declaring a model for "Email",
          // I'm declaring the controller
          // so, in my architecture, whenever I need to change some rule
          // for some entity, I know I only have to work at one single controller.
     }
}