Почему я не могу создать экземпляр метода CFC, используя New - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь создать экземпляр CFC, используя этот простой синтаксис

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

При выполнении вышеприведенного сообщения появляется сообщение об ошибке

Не удалось найти компонент или интерфейс ColdFusionpathtocfcfolder.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 голосов
/ 17 февраля 2019

Глядя на то, что я думаю, ваша структура папок, вероятно, выглядит примерно так:

\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-инъекций, но я считаю, что первое, что должна сделать пользовательская переменная, - это пройти хотя бы некоторую базовую очистку и проверку.Люди могут быть очень не приятны для вашего приложения.

...