php MVC concept, rails


php MVC concept, rails

我想在继续我的项目之前澄清一些事情,以防止糟糕的代码实践。我之前在轨道上用 ruby 开发过,我想知道它是否可以让它像在 PHP 中一样,因为我开始学习但我不想使用像 Zend、Yii 等框架

给我的模型是将数据插入数据库的位置。

控制器是查找所有参数并使用模型中的函数将数据处理到数据库中的地方。此外,当过程返回成功或失败时,它还会路由或重定向。

view是获取在控制器中初始化的即时变量,并使用它来以正确的格式呈现数据的地方。

所以,这是我在PHP中的问题。我想用php创建CRUD。我浏览了许多文章或帖子(在stackoverflow等中),但我感到困惑的是,有些人说的是不同类型的事情。

在我看来,模型是仅与数据插入/查询数据库相关的地方。所以,我的创建,显示,更新,删除的每个查询,我都会放入我的模型中。这是我模型中create_user函数的示例。

function create_user($firstName, $lastName,$username, $password){
    $query = "INSERT INTO `users` (`user_id`, `first_name`, `last_name`, `email`, `username`, `password`, `created_at`, `handphone_no`, `street_address`, `city`, `state`, `country`, `postal`, `birthday`, `company_id`)
            VALUES (NULL, ?, ?, NULL, ?, ?, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 2)";
    if($stmt = $this->conn->prepare($query)) {
        $stmt->bind_param('ssss', $firstName, $lastName,$username, $password);
        $stmt->execute();
    }
} 

所以,我的第一个问题:在我的模型中,我是假设到一个对象并传递给控制器??还是只是返回 true 或 false 来指示过程的成功或失败。

在我的用户控制器中,

class Users_controller {
private $user;
function __construct(){
    $this->user = New User();
}
function create($firstName, $lastName,$username, $password){
    $this->user->create_user($firstName, $lastName,$username, $password);
}
}
我的

第二个问题:对于我的 CRUD,在 rails 中,它要么找到对象的 ID 并显示/编辑它,要么创建/销毁一个新模型。那么,我的控制器在这里必须返回一个对象才能在视图中呈现数据?以及我应该如何将我的表单连接到控制器。从我的表单将参数传递给控制器。

所以,现在我只考虑这一点,任何指导和明确的例子让我了解更多,因为我是 php 的新手。谢谢...

好的,希望这个答案不会长,但我们开始了......

首先,RoR实际上是一个框架,所以在PHP中最接近它的东西就是一个框架。但是,你不会在PHP中找到rails克隆(或任何接近的东西)。此外,几乎每个PHP框架都声称实现了MVC,但几乎没有一个。他们中的大多数都呈现了某种修改和简化版本的 MVC,其中包含猖獗的 SOLID 违规和各种其他问题。在这个答案中,我将MVC的这些变体简称为"FMVC"。综上所述,由于持久模型的必要性,在PHP中正确的MVC在技术上是不可能的。(注意:你可以在PHP中做到这一点,但这并不容易,而且可能是一些丑陋/"黑客"的代码)。

如果你准备学习一些东西,这是我的建议:如果你有一个项目,选择一个通常吸引你的框架,然后继续下去。从里到外学习它,深入研究源代码,审查一些代码,并确保(大多数情况下)忽略该特定框架的所有反对者。我说"大部分"是因为如果你真的想学习MVC或OOP-PHP,最好的方法是查看现有的实现,真正理解代码的好、坏和丑陋的部分。这将为您提供坚实(请原谅双关语)的坚实原则知识基础,以及坚实的违规行为。

如果你想编写自己的 MVC 框架或学习一般的 MVC,首先要了解几件事:

  1. 在 OP 中,您似乎误解了模型到底是什么;在MVC模式中,"M"(模型)是一个。如果你想要一个冗长但非常准确的模型描述,请参阅tereško的这篇文章,因为它是目前SO上最好的答案。简而言之,模型层由许多部分组成,即数据映射器、域对象和"服务"。数据映射器类似于 FMVC 中的"模型"类 - 它们包含数据库查询。域对象基本上只是域数据的容器。"服务"是与模型层交互的点:您调用服务来执行某些操作,它执行模型层内的工作。通常,不会直接调用服务外部的数据映射器(或域对象)。

  2. CRUD 不是一个东西,它是一个概念 - 要包含在类中的方法列表(创建、读取、更新、删除)。数据映射器通常包含 CRUD 方法(通过扩展服务也是如此,尽管有时更抽象一些)

  3. 重申一下(因为它非常重要),几乎没有PHP框架实现正确的MVC,所以向它们寻求学习MVC的指导是一个坏主意。您可能会以这种方式学习 FMVC,但正确的 MVC 距离他们实现的内容还有很长的路要走。

  4. 如果你不完全理解OOP和SOLID原则,那么在MVC中编码将是一场噩梦。如果你想学习MVC,回到并重新学习或刷新OOP的基础知识是你应该做的第一件事。

现在谈谈您的具体问题:

  1. 这个问题真的没有意义。对模型层的调用是通过服务进行的,这些服务通常将域对象传递给相关数据映射器进行处理。数据映射器将域对象(包含所有结果数据)返回到从模型层外部调用的服务。

  2. 这个问题也没有意义 - 阅读我之前链接的帖子应该可以消除一些困惑。

TL;dr - 阅读这篇文章。

我不确定你为什么不想使用PHP框架,因为RoR也是一个框架。

我以前开发过自己的PHP框架,可以从经验中告诉你,除非你对你的应用程序有一些非常具体的要求,否则这通常是一个坏主意。

我建议你试试 Yii,它在允许的编码方面非常自由。

无论如何,回答您的问题:

首先,我将创建一个执行 CRUD 操作的通用模型类,而不必为每个类重新创建。因此,例如,您定义可用的属性(或直接从数据库获取)并具有通用的"save"函数,该函数将根据主键值的存在进行插入或更新。

然后,当您保存时,您应该在成功时返回 true,在

无效数据/验证时返回 false,如果 SQL 请求失败,则应引发异常。

通过 POST 将数据从表单传递到控制器,并将值注入到对象中。从那里您可以检查对象是否存在于数据库中。