需要另一种方法来提取数据以显示在 Cakephp 视图中


Need another way to extract data to display in Cakephp view

我有以前自定义cms的表迁移到cakephp。模型、控制器、视图、帮助程序已经创建,我现在可以让它们工作了。但是,我在渲染文本字段时遇到了一些问题。

原始表中的文本包含需要解析的标记代码,以便可以正确显示它们。我为此做了一个帮助程序,到目前为止,它现在可以解析大多数标记代码。剩下的是解析嵌套列表和代码,如下所示:

{img src="showImage.php?xxxx" alt=" link="}其中 xxxx 是图像表中的 ID。

从以前的系统中,这实际上调用了图像表并查找图像的实际URL,以便可以显示它,并且记录中可以有相当多的代码。帮助程序可以提取图像ID,但根据我在Cakephp中的理解,视图和帮助程序主要用于渲染控制器已经检索到的数据。如果是这种情况,那么我似乎将无法调用图像表并传递这些图像 ID 以获取显示图像所需的内容,或者更确切地说,不建议这样做。现在,如果帮助程序无法调用控制器,我有点不知道将代码放在哪里以获取图像数据。

抱歉,Cake 新手在这里,仍在学习如何正确使用 Cake,所以如果您能指出我正确的方向 - 在哪里放置代码,或者如果我需要创建一个插件或组件或任何东西 - 将不胜感激。

您可以在帮助程序中使用 requestAction()。即使 requestAction() 的性能还可以,我也不会称其为完美的解决方案,但这样您就必须为每个图像进行一个数据库查询,效率非常低,这不应该发生在视图层中。顾名思义,请求操作将请求控制器操作,并且该操作必须返回数据。

如果你想进行真正的 MVC 冲突,你也可以只 ClassRegistry::init() 图像模型,并使用视图中的模型实例直接获取记录。但这是不好的做法。

现在我认为尊重MVC的正确解决方案。 :)相反,您可以使用 Model::afterFind() 回调,在此处提取所有图像 ID,并使用您提取的 id 集执行 find('all'),并将它们添加到结果中。这里的优点是对所有图像进行单一查询。

最佳做法是使用一个单独的方法,如 extractImageIds() 并从 afterFind() 调用它。这样它在逻辑上是分开的,并且也可以比在 afterSave() 中坚持其他东西更好地进行测试。

如果你有计划重构这个遗留的图像处理,我还写了一个插件,负责适当的抽象文件存储和图像处理。