为什么我不能使用New实例化CFC的方法

时间:2019-02-17 14:46:51

标签: coldfusion coldfusion-2018

我正在尝试使用这种简单的语法实例化CFC

<cfset Sale = New pathtocfcfolder.sale.GetSale(SaleID = URL.id) />

当我运行上面的命令时,我得到一个错误提示

  

找不到ColdFusion组件或接口   pathtocfcfolder.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>

1 个答案:

答案 0 :(得分:4)

看看我的意图是,您的文件夹结构可能类似于:

\pathtocfcfolder
.. Sale.cfc
page.cfm

该错误实际上说明了问题所在:没有GetSale组件。

使用New pathtocfcfolder.sale.GetSale(....),您试图实例化文件夹GetSale中的pathtocfcfolder\sale\组件。 CF不知道sale应该是组件。这就是Redtopia的建议行之有效的原因。通过使用sale(),您已经告诉ColdFusion,由于pathtocfcfolder的功能/方法,要查找的文件夹为sale,并从()组件开始。然后,CF立即调用GetSale(...)

这不是New真正应该做的。它是要实例化组件(或对象),而不是实例化那些组件的功能/方法。它可以(或者至少看起来如此),但这并不意味着它应该这样做。特别是如果您要在对象内部使用其他功能。实例化该组件一次,然后重复使用。

如果只想一次从组件内部使用一个函数然后丢弃该组件,则可以使用cfinvoke来调用该函数。否则,您将要实例化该对象并根据需要在该对象上调用函数。

另一方面,由于您使用的是ColdFusion 2018,因此可以使用new component("pathtocfcfolder.Sale")(而不是new pathtocfcfolder.Sale())来实例化组件,然后使用Sale.GetSale(...)来调用函数。 2018语法使您的意图更加清晰。

我还将再次提醒您直接在代码中使用URL变量。将它们发送到存储过程将解决许多SQL注入问题,但是我认为用户提供的变量应该做的第一件事就是至少进行一些基本的卫生检查和验证。人们对您的应用可能不太友善。