0

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

对我来说,模型是将数据插入数据库的地方。

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

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

所以,这是我在 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 新手。谢谢...

4

2 回答 2

0

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

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

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

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

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

然后当你保存时,你应该在成功时返回 true,在无效数据/验证时返回 false,如果 SQL 请求失败则抛出异常。

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

高温高压

于 2012-08-16T16:50:42.383 回答
0

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

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

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

如果您正在寻找编写自己的 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;博士 - 阅读这篇文章

于 2012-08-16T17:34:23.670 回答