初学者 CodeIgniter 概念 - 可重用的视图代码,该去哪里? (帮手?)

Posted

技术标签:

【中文标题】初学者 CodeIgniter 概念 - 可重用的视图代码,该去哪里? (帮手?)【英文标题】:Beginner CodeIgniter concepts - Reusable view code, where to go? (Helper?) 【发布时间】:2011-07-19 21:36:54 【问题描述】:

我是 CodeIgniter 的初学者,仍在努力完全掌握如何最干净地使用 MVC 意识形态。

我正在编写一个基本的 CMS 系统,该系统能够对条目进行投票和关注他人等,因此,我发现自己在多个视图中使用相同或相似的代码片段,其中包括各种 html 和逻辑片段如:

投票小组 关注/取消关注面板 登录/注销面板 检查用户是否登录等的代码...

我想知道将这段代码放在哪里以便统一?我在想一个帮手是要走的路吗? 如果我在controller中声明了helper,就可以从对应的view调用吧?

一些元素是动态的 - 例如关注/取消关注按钮 - 它需要检查您是否已经关注用户并显示适当的按钮,这需要模型进行检查。我现在拥有的是所有逻辑都在控制器中,它返回一个适当的按钮,但是在控制器返回中返回形成的 html 代码似乎很奇怪。应该更像:

控制器检查您是否在关注某人 控制器将布尔值传递给视图 视图调用具有此值的助手来绘制相应的按钮

另外,作为第二个问题,我已经在 foreach 循环中对 mysql 数组进行了相当多的循环,以处理从视图返回的 mysql 结果。似乎我的观点变得有些复杂,但我想不出另一种方法来做到这一点,尽管也许这也应该在另一个助手中完成?

抱歉,如果这是一个幼稚或重复的问题,确实有很多围绕这个主题的讨论,但它并不总是容易与另一个项目相关。

【问题讨论】:

感谢到目前为止的答案 - 我正在执行模型中的所有数据库获取,但正在视图中执行相当多的逻辑。例如。我让控制器将 entry 加载到结果中,然后将每个 entry 的所有 votes 加载到另一个结果中。然后视图有一个嵌套的 foreach 循环来显示每个条目,然后显示该条目的相应投票,这是“好的”还是我应该以另一种方式接近它? @thrice801 - 我只是想知道为什么这个用户提到在视图中加载帮助器不是首选 - ***.com/questions/804399/… 【参考方案1】:

Helper 无疑是模块化任何不是DRY 的东西的一种方式。另一种是使用局部视图。 CodeIgniter 看起来 像它支持局部视图。 Here's 一个很好的细分 - 不是特定于 php,但讨论应该是不可知的。

【讨论】:

【参考方案2】:

就处理用户登录而言,您可能希望使用静态类和单例设计模式,这将允许您检查特定用户是否已登录或未在应用程序的任何位置登录。这里有一个很好的教程 http://www.phpandstuff.com/articles/codeigniter-doctrine-scratch-day-4-user-login

加载助手,我不相信在你的控制器中加载它会自动将它加载到你的视图中。我认为您必须在视图文件中重新加载帮助程序,或者您必须自动加载帮助程序。 (不记得了,但我很确定)。

关于遍历 mysql 结果,您应该始终为此使用模型。从您的应用程序中获取或排序信息的任何功能都应在模型中完成。然后,在您的视图文件中循环遍历结果并按照您的选择格式化数据。

【讨论】:

【参考方案3】:

在开发具有您提到的投票功能的 http://newspapair.com 时,我使用帮助程序和自定义类将功能分散到多个视图中。

Helper - 具有没有类的功能。因此,可以将一个独立的函数或一组函数放在一个文件中并保存为助手。

例如,我为 NewsPapair 使用了具有通用表单处理功能的助手,而不是静态类。但这不是要做的“最佳实践”。我这样做是因为我已经拥有了之前项目中的功能。

至于循环遍历 MySQL 结果,尝试编写一个允许 DB 服务器完成繁重工作的查询。这将使您的代码更有效率。也许用示例代码询问有关特定查询的问题。还要在您的模型中收集所有数据。

【讨论】:

以上是关于初学者 CodeIgniter 概念 - 可重用的视图代码,该去哪里? (帮手?)的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter 4 在 AJAX 模式中重用 CSRF 令牌

在 CodeIgniter 中重用 oracle 序列中的值

CodeIgniter 有插件/扩展/模块吗?

如何使用 authlib 保存和重用令牌

如何在 Django 中重用可重用的应用程序

Java初学——面向对象的封装,继承,多态