Как условно передать аргументы экземпляру 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?


person volume one    schedule 30.10.2018    source источник
comment
Вы вызываете cfinvoke внутри другой функции? Если нет, то на самом деле нет настоящего arguments объема. Вы создаете структуру с именем arguments. И я считаю, что поскольку это структура, вы также можете столкнуться с проблемами передачи по ссылке.   -  person Shawn    schedule 30.10.2018
comment
Вы вызываете это из функции?   -  person Shawn    schedule 30.10.2018
comment
Да, я @Шон. Это происходит в рамках CFC, который обрабатывает сообщения, отправленные пользователем. См. здесь заголовок =" следует ли использовать cfinvoke или что-то еще для многократного вызова cfc"> stackoverflow.com/questions/53064456/   -  person volume one    schedule 31.10.2018


Ответы (2)


Вы можете использовать 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)>
person rrk    schedule 30.10.2018
comment
Спасибо за это. Но я уже использую argumentCollection для передачи переменных области переменных. Как бы я передал как область переменных, так и аргументы? - person volume one; 30.10.2018
comment
В вашем примере не показано, что вы передаете argumentsCollection, поэтому я не уверен, что вы имеете в виду, когда говорите, что это так. Кроме того, вы можете захотеть использовать необязательные аргументы в определении вашего метода, которым можно присвоить значение по умолчанию. - person Redtopia; 30.10.2018
comment
Как только я запустил <cfset ImageHandler.SomeMethod(argumentCollection=args)>, как мне <cfreturn> вернуть результат на вызывающую страницу? При использовании '‹cfinvoke›' я получаю 'returnvariable', которую помещаю в '‹cfreturn returnvariable/›' и отправляю обратно вызывающей стороне. - person volume one; 30.10.2018
comment
Ваше возвращаемое значение будет в myReturnValue для myReturnValue = ImageHandler.SomeMethod(argumentcollection=args) при условии, что ваш SomeMethod() имеет return. - person Shawn; 30.10.2018
comment
@Шон, спасибо. так что должно быть <cfset ImageHanderResult = ImageHandler.SomeMethod(argumentCollection=args)> правильно? - person volume one; 30.10.2018
comment
да. И тогда ImageHandlerResult будет содержать возвращаемое значение SomeMethod(). Но убедитесь, что SomeMethod() действительно возвращает то, что вы хотите. - person Shawn; 30.10.2018
comment
@Shawn да, я завернул ImageHanderResult в тег cfif, чтобы проверить, существует ли structkey и есть ли у него len(), прежде чем возвращать его. - person volume one; 30.10.2018
comment
Вы хотите убедиться, что он что-то возвращает каждый раз, и, если вам нужно, проверьте его существование дальше по рабочему процессу. - person Shawn; 30.10.2018

Существует аналогичный способ, который можно использовать для передачи условного attributes в теги ColdFusion. Ниже приведен пример тега <cfmail>.

<cfset local.cfmailArguments = {
  to : '[email protected]',
  from : '[email protected]',
  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>

Вместо того, чтобы управлять разными тегами в каждом условии.

person rrk    schedule 01.11.2018