【问题标题】:How should I be laying out my code in Codeigniter?我应该如何在 Codeigniter 中布置我的代码?
【发布时间】:2013-11-26 07:27:34
【问题描述】:

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

控制器:立即调用模型,然后调用视图。除了决定调用哪个模型和视图之外没有其他真正的逻辑

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

视图:只包含布局,几乎为零逻辑。

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

第三方:下载的插件

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

提前致谢

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

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

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

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

    这些类对您放入实体文件夹(也在应用文件夹中)的实体进行操作。

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

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

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

    鲍勃叔叔对此进行了精彩的讨论:http://www.youtube.com/watch?v=WpkDN78P884

    【讨论】:

    • 该视频不存在。可能链接不好。此外,如果这是 ruby​​conf 的演讲,那么它实际上并不是关于 MVC,而是关于 Rails 对该架构的错误实现。
    • 是的。我现在修复了链接。该主题也适用于 CI 和许多其他 PHP 框架。
    • 赞成,因为它是一个很棒的视频,适用于 PHP,谢谢。到 OP - 有许多 Robert C. Martin(鲍勃叔叔)讲课的免费视频 - 非常值得一看。并且无论他们多大年纪都是其永恒的校长。
    【解决方案2】:

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

    例如,如果您有一个编辑器 - 然后您可以为该编辑器创建“用例” - 演员需要做什么以及他们正在处理什么资产。然后,您的方法会从这些用例中流出。这也大大简化了安全性。您不是在创建一个控制器,它为具有 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) ; 
    

    "this user get by ID" -- 很清楚发生了什么。 你可以大声读出来,这很有意义。这是关键测试。这也意味着新人可以更快地查看您的代码并理解它。

    martin 在大声朗读代码方面做了很多工作 - 起初这听起来很傻,但它对您的代码的长期可维护性有很大的影响。

    我来回讨论的一件事-应该是“获取”还是“返回”-我通常使用获取,因为它简短而直接。

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

    我会再次观看所有罗伯特·马丁的视频。并不断尝试不同的命名约定。大声说出来。另一个角度是您将不得不编写更少的 cmets。

    好的,这是另一个准则 - 写下您的变量名称,以便它们有意义。不要缩写它们。

     $first // NO why? first what?? 
    
     $firstname or $first_name or $firstName // yes first name 
    

    这里有一些robert c martin关于命名的规则

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

    您不必阅读方法的主体即可知道它的作用。它的名称应该告诉您。

    一个方法的行为越复杂,它的名字就越通用,并且应该从中提取更多的子方法。

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

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

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

    【讨论】:

    • 非常感谢!如果存在类似的东西,我希望看到文件夹布局和名称/方法的最佳使用示例:/
    • 添加到上面的答案
    • 非常感谢您的跟进。我肯定会深入研究这些链接!你帮了大忙
    猜你喜欢
    • 1970-01-01
    • 2015-12-24
    • 2010-10-08
    • 2015-09-06
    • 2011-01-05
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 2017-09-22
    相关资源
    最近更新 更多