Использование ‹cfinvoke› в ColdFusion

Я хотел бы написать код проверки на стороне сервера для проверки всех пользовательских данных на моей странице. Я хотел бы сохранить все эти проверки на стороне сервера с уровня представления. Теперь я изучаю создание компонента и храню в нем все функции проверки. Я буду использовать тег <cfinvoke> для доступа к методам проверки на моей пользовательской странице. Но проблема в том, что мне нужно применить проверку примерно к 50 пользовательским вводам и использовать тег <cfinvoke> 50 раз. Может ли кто-нибудь сказать мне, что многократное использование <cfinvoke> повлияет на производительность, или есть ли другой лучший подход, который я могу использовать?


person kamil hussain    schedule 29.10.2017    source источник


Ответы (1)


Нет заметных накладных расходов при использовании <cfinvoke>. Но я бы все же рекомендовал вам избегать его здесь. Вместо этого рассмотрите это (пример):

Валидатор.cfc

<cfcomponent>

    <cffunction name="validateX" access="public" ...>
        ...
    </cffunction>
    <cffunction name="validateY" access="public" ...>
        ...
    </cffunction>
    <cffunction name="validateZ" access="public" ...>
        ...
    </cffunction>

</cfcomponent>

контроллер.cfm

<cfset validator = new Validator()>

<cfset validator.validateX(...)>
<cfset validator.validateY(...)>
<cfset validator.validateZ(...)>
...

Теперь вы можете легко работать с результатом проверки.

Если вы вернете логическое значение:

<cfif validator.validateX(...)>
    ...
<cfelse>
    ...
</cfif>

Если вы возвращаете массив с ошибками:

<cfset errors = []>
<cfset errors.addAll( validator.validateX(...) )>
<cfset errors.addAll( validator.validateY(...) )>
<cfset errors.addAll( validator.validateZ(...) )>

и т.п.

<cfinvoke> создает экземпляр класса (new Validator()) и таким же образом вызывает метод validateX(...). Основное отличие состоит в том, что экземпляр создается каждые <cfinvoke> заново, и возвращаемое значение должно указываться как входная переменная (returnVariable), что в большинстве случаев громоздко.

person Alex    schedule 29.10.2017
comment
Спасибо, Алекс. Можете ли вы объяснить разницу между использованием ‹cfinvoke› и вашим способом? Я новичок в Холодном синтезе. Ваш способ кажется более читабельным. - person kamil hussain; 29.10.2017
comment
Да, оператор new был недавно введен в CF9. Я добавил объяснение к моему ответу внизу относительно различных подходов. - person Alex; 29.10.2017
comment
Спасибо Алекс за помощь. - person kamil hussain; 29.10.2017
comment
Еще одно замечание: New вызовет функцию init() вашего метода. Конечно, вы также можете использовать createObject() или cfobject, но чаще всего я выбираю New. - person Shawn; 30.10.2017