我应该如何在Codeigniter中布置我的代码?

时间:2013-11-26 07:27:35

标签: php codeigniter

目前我正在做这样的事情:

控制器:立即调用模型然后调用视图。除了决定调用哪个模型和视图

之外没有其他逻辑

模型:包含数据库中每个表的所有函数。我的数据库中有一个模型类及其每个表的方法。

查看:仅包含布局,几乎为零逻辑。

:我不是特定于数据库表的所有类

第三方:已下载的插件

我的问题是,这是正确的吗?例如,我应该总是将非特定于表的类放在库中吗?如果我的某个类或函数是“产品”和“客户”表的组合,那么该怎么办?

提前致谢

2 个答案:

答案 0 :(得分:2)

您的应用程序不应与您的框架混在一起。这意味着它应该在自己的文件夹中(您可以在应用程序之后命名)。在那里,我建议你保留所有纯PHP,如果你想要你的库,那么使用composer来安装它们。

这使您可以在不加载框架的情况下测试应用程序,这是一个很大的好处。此外,如果您想要切换框架,或者转移到一个完全不同的平台(例如独立),那么它将变得更加容易。

在应用程序文件夹中,每个用户故事/用例都有一个类(通常是动词,想想processOrder)。您可以将它们放在名为interactors的文件夹中。

这些类对你放在实体文件夹中的实体(也在app文件夹中)进行操作。

要与您希望定义明确边界(接口)的应用程序进行交互。您可以从控制器调用用例并显示结果。您的控制器负责将数据从应用程序移动到用户,反之亦然(当然使用视图)。

您的数据库内容(包括API和其他数据源)也应该是分开的。我们需要明确的界限。在其他情况下,您需要使用数据填充实体或直接向交互者提供数据。我建议您使用存储库。

这也允许您将应用程序与非常适合测试的数据库部分分离,您只需创建存根存储库,然后运行测试而无需使用数据库。

鲍勃叔叔对此有一个很好的讨论:http://www.youtube.com/watch?v=WpkDN78P884

答案 1 :(得分:1)

根据角色(有时称为Actors)构建应用程序。换句话说,你不构建基于“编辑”的控制器 - 你根据“编辑器”构建它,以及它们需要做什么。这可能听起来像文字游戏,但实际上非常深刻,因为“工具”应该为使用它们的人服务。

例如,如果你有一个编辑器 - 那么你就可以为编辑器创建“用例” - 演员需要做什么以及他们采取什么样的资产。然后,您的方法将从这些用例流出。这也极大地简化了安全性。您没有创建一个控制器,为5个不同的用户提供5种不同的安全配置。你只有一个具有独特安全性的编辑器 - 一旦你建立了他们的证书(登录) - 你不必一遍又一遍地检查它。

命名至关重要。这是易于理解的应用程序与令人困惑的应用程序之间的关键区别。允许自己更改和优化控制器,模型和方法名称,以便它们变得更加清晰。您应该能够查看模型文件夹,查看模型的名称 - 并确切知道应用程序的功能。

一种方法应该做一件事,做得好。如果你的方法有3种不同的东西,可以将它分成3种方法。

在模型变大后拆分模型,然后安排文件夹。哪个更容易 - 在1000行代码或300行中找到方法?拆分模型会使速度更快,因为您可以更加具体地命名模型。如果一件事情很复杂的话,拥有一个只做一件事的模型是完全没问题的。

如果您正在使用CI,我会建议您专注于构建模型与库。另一个建议是在控制器中构建 - 然后在最终确定时将代码推送到模型。所以就像一个联系表单 - 你在控制器中构建验证,将所有代码放在一起,很容易找到。你完成它,然后将验证代码推送到自己的模型。

(你提到产品/客户 - codeigniter对于电子商务来说很棒)

=====

编辑

命名 - (摇头)是的我还在学习。我要说的一件事 - 我不认为将“模型”这个词放在你的模型名称中是一个好习惯,如

 $this->user_model->getUser($id) ; 

有一段时间我认为这种模式确实很糟糕

 $this->user_m->getUser($id) ; 

我写了一篇关于它有多酷的帖子。然后我意识到这根本不酷,并删除了帖子!想一想 - 你不要从你的控制器调用其他控制器。你只打电话给模特。为什么到处都重复“模特”这个词呢?

 $this->user->getUser($id) ; 

这就是我可能会如何开始。但现在我们想尝试让它可读,那么

$this->user->getBy($id) ; 

“这个用户通过ID获取” - 它非常清楚发生了什么。 你可以大声朗读它是有意义的。这是关键的测试。这也意味着一个新人可以查看你的代码并更快地理解它。

马丁在大声朗读代码方面做了大量工作 - 起初它可能听起来很愚蠢,但它对你的代码长期可维护性有着巨大的影响。

有一件事我来回走动 - 应该是“得到”还是“回归” - 我通常使用get,因为它短而直接。

如果您不确定是否会有具有该ID的用户,我会使用Find。如果你得到一组东西 - 比如搜索产品 - 并且可能没有任何结果,那么可能是searchFor($ item)或类似的东西。

再次,我会观看每个罗伯特马丁视频。并继续尝试不同的命名约定。大声说出来。另一个角度是你将不得不写更少的评论。

好的,这是另一个指南 - 写出你的变量名,这样才有意义。不要缩写它们。

 $first // NO why? first what?? 

 $firstname or $first_name or $firstName // yes first name 

这里有一些关于命名的罗伯特·马丁规则

小范围内的方法应具有长而精确的名称。长范围中的方法应具有通用名称。

你不应该阅读方法的主体来了解它的作用。它的名字应该告诉你。

方法的行为越复杂,其名称越通用,应从中提取更多的子方法。

请注意 - 在他的讲座等我从未听过罗伯特·马丁说的字母php。他可能不认为这是一种真正的语言。但令人敬畏的是他的例子主要是在java中,而且语法与在codeigniter中编写方法非常相似。 (所以不要担心你不是java程序员)

这是对同一个问题的一些有趣回答

https://softwareengineering.stackexchange.com/questions/119345/meaningful-concise-method-naming-guidelines