CakePHP在哪里放共享代码?

时间:2014-09-29 14:30:03

标签: php shell cakephp filesystems cakephp-2.0

我在Cake中开发了一个与文件系统密切交互的应用程序。基本思想是监视和索引文件夹及其子文件夹和文件,并为数据库中的每个文件保存元数据。到目前为止它工作正常,但现在我在理解MVC机制方面遇到了一些问题。

我有这么重的FilesController,有很多函数检查文件是否是最新的,或者是否已经移动,更新数据库条目等等......现在我想从一个文件中调用一些这样的动作shell / cronjob,我也想在浏览器中调用它们。

我听说很多人抱怨用贝壳进口控制器,我想我知道为什么这是个坏主意。但是现在我想在shell和控制器中使用与FileModel交互的相同代码。在哪里放?在这种情况下,最佳做法是什么?在组件中,加载模型?在控制器中,将其导入shell?

提前感谢您的帮助< 3

1 个答案:

答案 0 :(得分:2)

  

我有这么重的FilesController,有很多函数检查是否   文件是最新的,或者如果它已移动,

错误的地方,重型控制器绝对是错误的。你想要胖模特,瘦的控制器。如果有逻辑提取元数据我可能会把它放到app / Utility / FileMetaData或app / Lib / FileMetaData.php中并使它成为一个新类。根据它的作用,您可以扩展核心类文件夹或文件。

元数据和读取文件夹的处理逻辑应该进入模型。通过将$ uses属性与模型数组一起使用,可以像在控制器中那样从shell中使用该模型。

为了实现该类,我将在模型中使用辅助方法(我表示视图助手!),如返回实例的getMetaDataReader()。这样做的原因是能够在单元测试中模拟该方法调用的结果。此外,如果你改变了类或构造函数args,你只需要改变一个地方。

控制器在炮弹中显然是错误的。没有要求处理。当然在技术上你可以做特技并在那里实例化它们,但这是错误的,没有任何意义。如果您认为必须或“需要”这样做,那么您的应用程序架构就会出现问题。

您可能也想查看我的FileStorage插件。您可以在那里实现事件监听器,当存储文件时,监听器会自动处理元数据。