coldfusion - 为什么我不能使用 New 实例化 CFC 的方法
问题描述
我正在尝试使用这种简单的语法来实例化 CFC
<cfset Sale = New pathtocfcfolder.sale.GetSale(SaleID = URL.id) />
当我运行上述内容时,我收到一条错误消息
找不到 ColdFusion 组件或接口路径tocfcfolder.sale.GetSale
但是,如果我只是在没有该方法的情况下实例化组件,它可以像这样正常工作:
<cfset Sale = New pathtocfcfolder.sale() />
<cfdump var="#Sale.GetSale(SaleID = URL.id)#" />
GetSale 函数基本上是这样的:
<cffunction name="GetSale" returntype="Query" access="public">
<cfargument name="SaleID" type="numeric" required="true" />
<cfstoredproc procedure="dbo.GetSale">
<cfprocparam cfsqltype="cf_sql_integer" dbvarname="@SaleID" value="#ARGUMENTS.SaleID#"/>
<cfprocresult name="rsSale" resultset="1"/>
</cfstoredproc>
<cfreturn rsSale /> <!--- returns the query from the database --->
</cffunction>
解决方案
看看我认为的意图是什么,您的文件夹结构可能类似于:
\pathtocfcfolder
.. Sale.cfc
page.cfm
该错误实际上说明了问题所在:没有GetSale
组件。
使用New pathtocfcfolder.sale.GetSale(....)
,您正在尝试实例化GetSale
文件夹中的组件pathtocfcfolder\sale\
。CF 不知道它sale
应该是一个组件。这就是 Redtopia 的建议奏效的原因。通过使用sale()
,您已经告诉 ColdFusion 要查看的文件夹是由于功能/方法pathtocfcfolder
而从组件开始。然后CF立即调用。sale
()
GetSale(...)
这不是真正New
应该做的。它旨在实例化组件(或对象),而不是这些组件的函数/方法。它可以(或至少看起来可以),但这并不意味着它应该这样做。特别是如果您要在对象内部使用其他功能。将组件实例化一次并重用它。
如果您只想在组件内部使用一次函数然后将组件丢弃,则可以使用cfinvoke
来调用该函数。否则,您需要实例化该对象并根据需要调用该对象上的函数。
附带说明一下,由于您使用的是 ColdFusion 2018,因此您可以使用new component("pathtocfcfolder.Sale")
(而不是new pathtocfcfolder.Sale()
)来实例化组件,然后使用Sale.GetSale(...)
来调用您的函数。2018 语法使您的意图更加清晰。
我还将再次提醒我URL
在代码中直接使用变量的注意事项。将它们发送到存储过程将处理大部分 SQL 注入问题,但我认为用户提供的变量应该做的第一件事是至少经过一些基本的清理和验证。人们可能对您的应用程序非常不友好。
推荐阅读
- bash - 将自定义 linux 子系统从一台机器导入另一台机器后,我无法让 ubuntu 将非 root 用户设置为默认用户
- html - Bootstrap justify-content-around 不传播项目
- javascript - 根据关键字数组过滤对象属性
- r - 比较两个数据集中的列
- python - Python Curve_fit.optimize put 函数模型与变量之间的条件
- c# - 使用 NLog 创建用于日志记录的自定义扩展函数
- flutter - 如何在颤动中将视频从模拟器内部存储加载到视频播放器
- python - 如何从单独列中的字符串中提取特定代码?
- awk - awk 从列 $3 创建多个包含模式和名称的文件
- python - 将 json 响应转换为 CSV 文件