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