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.
}
}
我在理解 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.
}
}