我刚刚开始使用ColdFusion OOP,我想制作一个DIV,根据用户所在的页面以及他们拥有的登录权限(角色)显示不同的用户链接。基本上是一个'上下文'菜单。
我应该将此工具栏/导航DIV放在.cfm或.cfc文件中吗?
重申; cfm或cfc文件需要知道用户所在的页面,并且还要检查他们所拥有的角色。根据这两条信息,它将显示一组指向用户的链接。角色信息来自数据库并存储在SESSION变量中,为了找出它们所在的页面,我猜它可以使用#GetFileFromPath(GetBaseTemplatePath())#
。
我的第一个想法是拥有一个普通的.cfm文件,将所有的表示和逻辑放在该文件中(HTML和许多<cfif>
语句)以确保在DIV中显示正确的信息,然后使用<cfinclude>
在页面上显示它。然后我开始想也许我应该制作一个自定义标签并要求调用页面传递用户的凭据和#GetFileFromPath(GetBaseTemplatePath())#
作为参数,然后让该自定义标签返回所有表示数据。
最后我想CFC也可以做到这一点,但我打破了在CFC中提供表现和逻辑数据的“规则”。
有关实现我正在尝试的最佳实践的任何建议吗?它最终将服务于数千名客户,因此我需要确保我的解决方案易于扩展。
答案 0 :(得分:6)
任何将HTML输出到屏幕的内容都应该是.cfm文件。
话虽如此,根据您的需要,您可以在CFC中使用生成HTML的方法,但该方法只是将HTML作为字符串返回。
在编程中,绝对数量很少,但这里有一个:你不应该使用output =“true”直接输出函数或方法中的任何内容。相反,无论生成什么内容,都应该从方法返回。
如果您需要多次使用此显示元素,自定义标记可能是最好的方式而不是包含。
答案 1 :(得分:1)
我认为安全性是我可以看到的菜单项和可以运行的页面的组合。
主要安全功能位于主会话对象
内在菜单上
我调用了一个名为
的函数if (session.objState.checkSecurity(Section, Item) == 1)
then ...
用于页面安全性
function setupRequest() {
...
if (session.objState.checkSecurity(getSection(), getItem()) == 0) {
location("#request.self#?message=LoginExpired", "no");
return;
}
...
}
checkSecurity可以执行的操作的细节因应用程序而异,但它与FW / 1的工作方式有关。存在以下安全性变体:
session.objState.checkSecurity(getSection())
session.objState.checkSecurity(getSection(), getItem())
session.objState.checkSecurity(getSection(), getItem(), Identifier)
所有演示文稿都不知道安全性。
答案 2 :(得分:1)
我居住的规则:):
CFM文件中没有CF业务逻辑。只需使用一些服务模板并提供所需数据即可。
navService = com.foobar.services.Navigation(form, url);
以后输出#navService.GetNavConent()#
CFC文件没有直接输出,函数应始终返回内容。例如,创建一个基于某个逻辑创建一个链接的函数,第二个包装该函数并返回cfm模板。
还有一个提示,避免在您的服务中使用应用程序和会话范围。
这使得重构,测试和调试变得非常困难。
对于会话,您可以制作session.currentUser
,CurrentUser.cfc,它提供您需要的所有内容。例如session.currentUser.isAuthorized("backend/administration")
如果为true,则显示指向后端/管理的链接。
对于应用程序也是如此,如果您需要区域设置,应用广泛设置或某些单例,请创建application.applicationSettings
,ApplicationSettings.cfc并使用它来检索您在cfc中所需的所有信息。
这些规则将使您的应用程序更容易测试和调试,并且很容易明天在一些基于javascript的UI(如Angular或backbone.js)上迁移,因为您需要的所有edata已经在CFC中,理论上您只需要将remote
放在CFC中或在中间制作一些远程外观并完成。