如何有条件地将参数传递给 CFC 的实例?
How to conditionally pass arguments to an instance of a CFC?
我目前正在使用 <cfinvoke>
标记来调用 CFC 并向它们传递参数。这真的很方便,因为我可以使用标签只传递我想要的参数,例如:
<cfinvoke component="pathtofolder.imagehandler" method="SomeMethod" argumentcollection="#VARIABLES#" returnvariable="ImageHandlerResult">
<cfif structkeyexists(ARGUMENTS, 'Argument1')>
<cfinvokeargument name="Parameter1" value="#ARGUMENTS.Argument1#" />
</cfif>
<cfif structkeyexists(ARGUMENTS, 'Argument2')>
<cfinvokeargument name="Parameter2" value="#ARGUMENTS.Argument2#" />
</cfif>
<cfif structkeyexists(ARGUMENTS, 'Argument3')>
<cfinvokeargument name="Parameter3" value="#ARGUMENTS.Argument3#" />
</cfif>
</cfinvoke>
<cfreturn ImageHandlerResult /> <!--- how do you get this using createObject/new method? --->
如果我使用 new()
或 createObject()
方法创建 CFC 实例,然后在这个新创建的实例中调用这些方法,我将无法有条件地传递参数。我在运行时遇到错误。
<cfset ImageHandler = new pathtofolder.imagehandler()/>
<cfset ImageHandler.SomeMethod(
<cfif StructKeyExists(ARGUMENTS, 'Argument1')>
Parameter1 = ARGUMENTS.Argument1
</cfif>
<cfif StructKeyExists(ARGUMENTS, 'Argument2')>
Parameter2 = ARGUMENTS.Argument2
</cfif>
<cfif StructKeyExists(ARGUMENTS, 'Argument3')>
Parameter3 = ARGUMENTS.Argument3
</cfif>
)/>
如何使用上述方法有条件地传递参数?我应该在新实例上使用 cfinvoke
方法吗?在这种情况下,当我可以坚持在实际实例上使用 cfinvoke
时,创建实例然后再次使用 cfinvoke
的意义何在?直接使用 CFC?
您可以使用 argumentCollection
。参数集合是一个结构,每个键将被解构为单独的参数。
<cfset ImageHandler = new pathtofolder.imagehandler()>
<cfset args = {}>
<cfif StructKeyExists(ARGUMENTS, 'Argument1')>
<cfset args.Parameter1 = ARGUMENTS.Argument1>
</cfif>
<cfif StructKeyExists(ARGUMENTS, 'Argument2')>
<cfset args.Parameter2 = ARGUMENTS.Argument2>
</cfif>
<cfif StructKeyExists(ARGUMENTS, 'Argument3')>
<cfset args.Parameter3 = ARGUMENTS.Argument3>
</cfif>
<cfset ImageHandler.SomeMethod(argumentCollection=args)>
有一种类似的方法可用于将条件 attributes
传递给 ColdFusion 标记。以下是 <cfmail>
标签的示例。
<cfset local.cfmailArguments = {
to : 'toemail@test.com',
from : 'email@test.com',
subject : 'Passing custom smtp',
type : 'html',
}>
<!--- There are custom mail settings available in session.SMTPDetails --->
<cfif structkeyexists(session, "SMTPDetails")>
<cfset local.cfmailArguments['from'] = session.SMTPDetails.FromEmail>
<cfset local.cfmailArguments['server'] = session.SMTPDetails.Server>
<cfset local.cfmailArguments['username'] = session.SMTPDetails.UserName>
<cfset local.cfmailArguments['password'] = session.SMTPDetails.Password>
<cfset local.cfmailArguments['port'] = session.SMTPDetails.Port>
<cfset local.cfmailArguments['usetls'] = session.SMTPDetails.TLS>
<cfset local.cfmailArguments['usessl'] = session.SMTPDetails.SSL>
</cfif>
<cfmail attributecollection="#local.cfmailArguments#">
Your mail content.
</cfmail>
不必在每个条件下管理不同的标签。
我目前正在使用 <cfinvoke>
标记来调用 CFC 并向它们传递参数。这真的很方便,因为我可以使用标签只传递我想要的参数,例如:
<cfinvoke component="pathtofolder.imagehandler" method="SomeMethod" argumentcollection="#VARIABLES#" returnvariable="ImageHandlerResult">
<cfif structkeyexists(ARGUMENTS, 'Argument1')>
<cfinvokeargument name="Parameter1" value="#ARGUMENTS.Argument1#" />
</cfif>
<cfif structkeyexists(ARGUMENTS, 'Argument2')>
<cfinvokeargument name="Parameter2" value="#ARGUMENTS.Argument2#" />
</cfif>
<cfif structkeyexists(ARGUMENTS, 'Argument3')>
<cfinvokeargument name="Parameter3" value="#ARGUMENTS.Argument3#" />
</cfif>
</cfinvoke>
<cfreturn ImageHandlerResult /> <!--- how do you get this using createObject/new method? --->
如果我使用 new()
或 createObject()
方法创建 CFC 实例,然后在这个新创建的实例中调用这些方法,我将无法有条件地传递参数。我在运行时遇到错误。
<cfset ImageHandler = new pathtofolder.imagehandler()/>
<cfset ImageHandler.SomeMethod(
<cfif StructKeyExists(ARGUMENTS, 'Argument1')>
Parameter1 = ARGUMENTS.Argument1
</cfif>
<cfif StructKeyExists(ARGUMENTS, 'Argument2')>
Parameter2 = ARGUMENTS.Argument2
</cfif>
<cfif StructKeyExists(ARGUMENTS, 'Argument3')>
Parameter3 = ARGUMENTS.Argument3
</cfif>
)/>
如何使用上述方法有条件地传递参数?我应该在新实例上使用 cfinvoke
方法吗?在这种情况下,当我可以坚持在实际实例上使用 cfinvoke
时,创建实例然后再次使用 cfinvoke
的意义何在?直接使用 CFC?
您可以使用 argumentCollection
。参数集合是一个结构,每个键将被解构为单独的参数。
<cfset ImageHandler = new pathtofolder.imagehandler()>
<cfset args = {}>
<cfif StructKeyExists(ARGUMENTS, 'Argument1')>
<cfset args.Parameter1 = ARGUMENTS.Argument1>
</cfif>
<cfif StructKeyExists(ARGUMENTS, 'Argument2')>
<cfset args.Parameter2 = ARGUMENTS.Argument2>
</cfif>
<cfif StructKeyExists(ARGUMENTS, 'Argument3')>
<cfset args.Parameter3 = ARGUMENTS.Argument3>
</cfif>
<cfset ImageHandler.SomeMethod(argumentCollection=args)>
有一种类似的方法可用于将条件 attributes
传递给 ColdFusion 标记。以下是 <cfmail>
标签的示例。
<cfset local.cfmailArguments = {
to : 'toemail@test.com',
from : 'email@test.com',
subject : 'Passing custom smtp',
type : 'html',
}>
<!--- There are custom mail settings available in session.SMTPDetails --->
<cfif structkeyexists(session, "SMTPDetails")>
<cfset local.cfmailArguments['from'] = session.SMTPDetails.FromEmail>
<cfset local.cfmailArguments['server'] = session.SMTPDetails.Server>
<cfset local.cfmailArguments['username'] = session.SMTPDetails.UserName>
<cfset local.cfmailArguments['password'] = session.SMTPDetails.Password>
<cfset local.cfmailArguments['port'] = session.SMTPDetails.Port>
<cfset local.cfmailArguments['usetls'] = session.SMTPDetails.TLS>
<cfset local.cfmailArguments['usessl'] = session.SMTPDetails.SSL>
</cfif>
<cfmail attributecollection="#local.cfmailArguments#">
Your mail content.
</cfmail>
不必在每个条件下管理不同的标签。