Можно создать глобал с незаданной областью в application.cfc?
Я переношу старое приложение, которое использует application.cfm для использования application.cfc. CFM устанавливает несколько глобалов, таких как
<cfset dsn = "myDSN">
Я попытался поместить эту строку кода в onApplicationStart, onRequestStart и т. Д., Но попытка распечатать это значение на тестовой странице приводит к ошибке. Установка значения в области приложения (например, application.dsn), конечно, работает нормально, но я в сжатые сроки и не могу раскачать лодку, выполняя поиск по всему сайту и заменяя каждый глобальный объект.
Я знаю, что помещать их в области действия - это правильно, но в настоящее время есть ли способ перейти на использование Application.CFC, но все еще создавать глобальные переменные с незаданной областью?
3 ответа
Попробуйте положить его внутрь onRequest()
вместо onRequestStart()
,
Вам понадобятся и Application.cfc, и Application.cfm. Переместите весь основной код из Application.cfm в соответствующие части Applicaiton.cfc.
Тогда, и это может быть единственная строка в Applicaiton.cfm:
<cfset variables.dsn = "myDSN" />
Теперь вернитесь в Application.cfc и добавьте это вне всех функций:
<cfinclude template="Application.cfm" />
В вашем test.cfm теперь должна быть возможность вывести переменную dsn без префикса области действия:
<cfoutput>#dsn#</cfoutput>
Если вы определяете variables.dsn где-нибудь внутри CFC, вы помещаете переменную в область действия переменных CFC, которая является частной для CFC. Определив его в CFM, а затем включив CFM, он сохраняется в области переменных запроса страницы.
Сам борясь с этим, я дам вам свое решение. Обратите внимание, что это работает на CF9, я не знаю о других версиях (есть проблема с вызовами onRequest и AJAX в предыдущих версиях). По сути, необходимо иметь функцию onRequest в вашем Application.cfc. Вот основной шаблон:
<cffunction name="onRequest" access="public" returntype="void" output="true">
<cfargument name="targetPage" type="string" required="true">
<!--- include the requested page. --->
<cfinclude template="#arguments.TargetPage#">
</cffunction>
As far as I understand it: it's actually the cfinclude that enables you to access the functions. So, with this onRequest in your Application.cfc you can access the 'this' scope of the Application.cfc which would include your public functions & variables.
If you want a more in depth example of this then check out Framework-1 by Sean Corfield. It does this exact thing, all API methods are contained in the Application.cfc.