0

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

原始表格中的文本包含需要解析以便正确显示的标记代码。我为此做了一个助手,到目前为止它现在可以解析大部分标记代码。剩下对嵌套列表和代码进行解析,如下所示:

{img src="showImage.php?xxxx" alt="" link=""} 其中 xxxx 是 images 表中的 id。

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

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

4

1 回答 1

0

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

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

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

最佳实践是有一个单独的方法,如 extractImageIds() 并从 afterFind() 调用它。通过这种方式,它在逻辑上是分离的,并且也可以比在 afterSave() 中的其他东西卡住更好地进行测试。

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

于 2013-09-17T02:12:34.533 回答