2015-08-21 6 views
2

2 Вопросы -Глобальные переменные в ColdFusion

В CF8 в application.cfm я холодный установить глобальную переменную как так

<cfset DSN = "dej6_42"> 

Я сейчас пытается приспособиться к Application.cfc в CF10/Lucee и не может понять, как установить эту же переменную.

Вот мой текущий Application.cfc

<cfcomponent output="false"> 

    <cfset This.name = "My Application"> 
    <cfset This.clientmanagement="True"> 
    <cfset This.loginstorage="Session"> 
    <cfset This.sessionmanagement="True"> 
    <cfset This.sessiontimeout="#createtimespan(0,0,10,0)#"> 
    <cfset This.applicationtimeout="#createtimespan(5,0,0,0)#"> 

    <cfset DSN = "dej6_42"> 
</cfcomponent> 

Я попытался

<cfset This.DSN = "dej6_42"> 

Затем попытался вызвать в отдельной странице

<cfoutput>#Applicaton.DSN#</cfoutput> 

Я думаю, что от моего исследования я буду необходимо использовать как application.cfc, так и application.cfm для выполнения вышеуказанного. * edit - Я попытался добавить include в конец файла application.cfc к applciation.cfm, и это не сработало.

2 Вопрос. Когда я помещаю какие-либо из стандартных функций в Application.cfc, мой сайт превращается в пустую страницу

Вот что Application.cfc - I, если я удалю все ниже набора DSN, тогда он отобразит сайт.

<cfcomponent output="false"> 

    <cfset This.name = "My Application"> 
    <cfset This.clientmanagement="True"> 
    <cfset This.loginstorage="Session"> 
    <cfset This.sessionmanagement="True"> 
    <cfset This.sessiontimeout="#createtimespan(0,0,10,0)#"> 
    <cfset This.applicationtimeout="#createtimespan(5,0,0,0)#"> 

    <cfset DSN = "dej6_42"> 

    <cffunction name="onApplicationStart"> 

    </cffunction> 

    <cffunction name="onApplicationEnd"> 

    </cffunction> 


    <cffunction name="onRequestStart"> 

    </cffunction> 

    <cffunction name="onRequest"> 

    </cffunction> 


    <cffunction name="onRequestEnd"> 

    </cffunction> 

    <cffunction name="onSessionStart"> 

    </cffunction> 

    <cffunction name="onSessionEnd"> 

    </cffunction> 

    <cffunction name="onError"> 

    </cffunction> 



</cfcomponent> 
+2

Ответ Мэтта правильный. У CFC есть свои собственные области переменных, которые не разделяются с остальной частью запроса. Это по дизайну, желательно или инкапсуляция. Также обратите внимание, что область «приложение» никоим образом не ссылается ни на какие переменные, установленные в любой области приложения Application.cfc. Кроме того, прочитайте документы на Application.cfc, вы перехватываете свой запрос пустыми методами. –

+0

Возможно, вы захотите прочитать это: http://www.learncfinaweek.com/week1/Application_cfc/, поскольку он объясняет эти методы жизненного цикла. – Abram

ответ

3

Вы должны установить его в сферу применения

<cfcomponent output="false"> 
    <cfset This.name = "My Application"> 
    <cfset This.clientmanagement="True"> 
    <cfset This.loginstorage="Session"> 
    <cfset This.sessionmanagement="True"> 
    <cfset This.sessiontimeout="#createtimespan(0,0,10,0)#"> 
    <cfset This.applicationtimeout="#createtimespan(5,0,0,0)#"> 
    <cfset application.DSN = 'dej6_42'> 
</cfcomponent> 
+0

Я пробовал это, и я получаю сообщение об ошибке. Элемент DSN в приложении не определен. –

+3

Неверное место для установки переменной области приложения. Он должен быть в 'onApplicationStart()' –

5

Ваш пример не устанавливает глобальную переменную. Он задает переменную в области переменных: она не будет доступна для любого кода на основе CFC или каких-либо настраиваемых тегов, используемых в запросе. Он будет доступен только в Application.cfm, запрошенном файле, файлах, которые он включает, и OnRequestEnd.cfm

Application.cfc - это CFC (чтобы указать очевидное), поэтому переменные с переменным диапазоном, установленные в нем, являются доступно только в нем. Если вы хотите установить переменную приложения, вам нужно поместить ее в область приложения. Переменные области приложения должны быть установлены в обработчике onApplicationStart(), который запускается один раз, когда приложение запускается, но не по каждому запросу. В качестве сравнения Application.cfm (который называется неназванным) запускается по каждому запросу. Его следует называть OnRequestStart.cfm.

Если вы используете onRequest() перехватчик, и в рамках этого include первоначально запрошенный файл, то запрос будет выполняться в контексте экземпляра Application.cfc, и переменные, установленные в onRequest() будет доступны для остальной части магистрали код запроса, так же, как и ваша переменная в Application.cfm. Семантически, хотя, если вы имеете в виду переменную, существующую для жизни приложения (например, DSN), то наилучшим вариантом является его размещение в области приложения.

Это звучит для меня из выводов, которые можно сделать из вашего вопроса о том, что архитектура вашего приложения может быть томиться в 1990-х годах. Я думаю, вы должны прочитать об использовании фреймворка (например: FW/1 или ColdBox), чтобы лучше организовать ваш код в ремонте и масштабируемости.

Также вы должны прочитать на Application.cfcmethod reference).И, вероятно, ХФУ в целом: Using ColdFusion components-Developing guide.

Вам также может потребоваться модернизация вашего подхода к написанию CFML и сохранение тегов для кода просмотра, а в противном случае - скрипт. Это упрощает выполнение кода как для вас, так и для других разработчиков, которым в конечном итоге может понадобиться поддерживать его, если все приложение не забито тегами.

+0

Я не уверен, что следую тому, что вы имеете в виду, - модернизируя свой подход к написанию CFML и сохраняя теги для кода просмотра, и в противном случае используя скрипт. –

+0

Nix, что последний комментарий Адам. Я перечитываю то, что вы написали. Да, я согласен, это просто попытка Application.cfc. Я поддерживаю систему на основе тегов, так что это то, что мне удобно, и мы используем application.cfm-, и этот cfc - это другое существо, но я не против изменений. Его сложнее в этой среде, так как он больше поддерживает код, а затем основные изменения, требующие повторной записи. Это приключение наверняка, так как разработчику понравилось жесткое кодирование, а не использование переменных. –