Можно создать глобал с незаданной областью в application.cfc? - PullRequest
7 голосов
/ 09 июня 2010

Я переношу старое приложение, которое использует application.cfm для использования application.cfc.CFM устанавливает несколько глобальных переменных, таких как

<cfset dsn = "myDSN">

. Я пытался поместить эту строку кода в onApplicationStart, onRequestStart и т. Д., Но попытка распечатать это значение на тестовой странице приводит к ошибке.Установка значения в области приложения (например, application.dsn), конечно, работает нормально, но я в сжатые сроки и не могу раскачивать лодку, выполняя поиск по всему сайту и заменяя каждый глобальный объект.

Я знаю, что помещать их в области действия - это правильно, но в настоящее время есть ли способ перейти на использование Application.CFC, но все еще создавать глобальные переменные с незаданной областью?

Ответы [ 3 ]

10 голосов
/ 09 июня 2010

Попробуйте положить его внутрь onRequest() вместо onRequestStart().

4 голосов
/ 09 июня 2010

Вам понадобятся и 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, он сохраняется в области переменных запроса страницы.

1 голос
/ 22 ноября 2010

Борясь с этим сам, я дам вам свое решение. Обратите внимание, что это работает на CF9, я не знаю о других версиях (есть проблема с вызовами onRequest и AJAX в предыдущих версиях). По сути, в вашем Application.cfc должна быть функция onRequest. Вот базовый шаблон:

<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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...