Существует несколько областей действия, доступных для любой части вашего кода: сеанс, клиент, cookie, приложение и запрос. Некоторые из них нежелательно использовать определенными способами (например, используя область «Запрос» или «Приложение» внутри ваших пользовательских тегов или CFC; это соединение , нарушает принципы инкапсуляции и считается плохой практикой), а некоторые имеют специальные цели: Файл cookie сохраняется на клиентском компьютере в виде физических файлов cookie, а переменные области видимости сеанса зависят от пользователя и истекают после сеанса пользователя на веб-сайте.
Если переменная крайне маловероятна для изменения (постоянна для всех намерений и целей) и может быть просто инициализирована при запуске приложения и никогда не записываться снова, обычно вы должны поместить ее в область приложения, поскольку она сохраняется между каждым пользователем и каждым сеансом. , При правильной реализации он пишется один раз и читается N раз.
Правильная реализация переменных приложения в Application.cfm может выглядеть следующим образом:
<cfif not structKeyExists(application, "dsn")>
<cflock scope="application" type="exclusive" timeout="30">
<cfif not structKeyExists(application, "dsn")>
<cfset application.dsn = "MyDSN" />
<cfset foo = "bar" />
<cfset x = 5 />
</cfif>
</cflock>
</cfif>
Обратите внимание, что существование переменной в области приложения проверяется до и после блокировки, поэтому, если два пользователя создают условия гонки при запуске приложения, только один из них завершит настройку переменных приложения.
Преимущество этого подхода заключается в том, что он не будет постоянно обновлять эти сохраненные переменные при каждом запросе, тратя время пользователя и циклы обработки на сервере. Компромисс в том, что он немного многословен и сложен.
Это было значительно упрощено с добавлением Application.cfc. Теперь вы можете указать, какие переменные создаются при запуске приложения, и вам не нужно беспокоиться о блокировке и проверке существования и всех этих забавных вещах:
<cfcomponent>
<cfset this.name = "myApplicationName" />
<cffunction name="onApplicationStart" returnType="boolean" output="false">
<cfset application.dsn = "MyDSN" />
<cfset foo = "bar" />
<cfset x = 5 />
<cfreturn true />
</cffunction>
</cfcomponent>
Для получения дополнительной информации о Application.cfc, включая все доступные специальные функции и каждую небольшую информацию о том, что и как его использовать, Я рекомендую этот пост в блоге Рэймонда Камдена .
Подводя итог, можно сказать, что область запроса доступна везде в вашем коде, но это не обязательно делает ее "правильной" для ее повсеместного использования. Скорее всего, ваш предшественник использовал его, чтобы нарушить инкапсуляцию, и это может быть громоздким для рефакторинга. Возможно, вам лучше оставить все как есть, но понимание того, какая область является лучшим инструментом для работы, определенно сделает ваш будущий код лучше.