CakePHP将共享代码放在哪里


CakePHP where to put shared code?

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

我得到了这个沉重的FilesController,它有很多功能来检查文件是否是最新的,或者它是否已经移动,更新数据库条目等等…现在我想从shell/cronjob调用其中的一些操作,我也想在浏览器中调用它们。

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

感谢您的提前帮助<3

我得到了这个沉重的FilesController,它有很多函数来检查文件是最新的,或者如果它已经移动,

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

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

为了实例化该类,我会在模型中使用一个helper方法(我并不是指视图helper!),比如返回实例的getMetaDataReader()。这样做的原因是能够在单元测试中模拟该方法调用的结果。此外,如果您更改类或构造函数参数,则只需更改一个位置。

外壳中的控制器显然是错误的。没有需要处理的请求。当然,从技术上讲,你可以做特技并在那里实例化它们,但这是错误的,没有任何意义。如果您认为必须或"需要"这样做,则说明您的应用程序体系结构有问题。

你可能也想看看我的FileStorage插件。您可以在那里实现一个事件监听器,并且在存储文件时让监听器自动处理元数据。