2010-03-15 2 views
2

Я просто хочу определить функцию в application.cfc и разоблачить ее приложение для всех запросов. Предпочтительно «назначение» произойдет только при запуске приложения.Каков правильный способ присвоить общий udf application.cfc?

Является предпочтительным способом, чтобы сделать что-то вдоль линий этого:

<CFCOMPONENT OUTPUT="FALSE"> 
<CFSET this.name = "Website"> 
<CFSET this.clientManagement = true> 
<CFSET this.SessionManagement = true> 

<CFFUNCTION NAME="GetProperty" OUTPUT="False"> 
    <CFARGUMENT NAME="Property"> 

    <CFRETURN this.Props[Property]> 
</CFFUNCTION> 

<CFFUNCTION NAME="OnApplicationStart" OUTPUT="FALSE"> 
    <CFSET Application.GetProperty = GetProperty> 
. 
. 
. 

или есть что-то лучше?

ответ

2

Лучшим способом хранения данных сайта конкретных конфигураций, вероятно, будет создать новый компонент с именем что-то такое, как SiteConfig .cfc с такими методами, как getProperty (propertyName) и setProperty (propertyName, value). Затем вы должны хранить этот CFC в области приложения, выполнив следующие действия внутри метода onApplicationStart Application.cfc как:

<cfset application.siteConfig = createObject("component", "SiteConfig").init() /> 

Назад к первоначальному вопросу, хотя о сохранении UDF в рамках приложения, ниже способ сделать что. Основа заключается в том, что в onApplicationStart вы создадите новую структуру приложений с сохраненными конфигурационными свойствами вашего сайта, такими как siteName и все остальное. Затем функция хранится в CFM-файле, который включен только в onApplicationStart, а затем скопирован в область приложения. Это означает, что все ваши обычные CFM-файлы страницы могут использовать application.getProperty (propertyName). Поскольку функция создается только один раз и сохраняется в области приложения, она удовлетворяет требованиям вашего оригинального вопроса о том, что «назначение произойдет только при запуске приложения».

Надеюсь, это поможет!

getProperty.function.cfm

<cffunction name="getProperty" output="false"> 
    <cfargument name="propertyName" type="string" required="true" /> 
    <cfreturn application.config[propertyName] /> 
</cffunction> 

Application.cfc

<cffunction name="onApplicationStart" output="false"> 
<cfset application.config = structNew() /> 
<cfset application.config.siteName = "My App's Display Name" /> 
<cfinclude template="getProperty.function.cfm" /> 
<cfset application.getProperty = variables.getProperty /> 
</cffunction> 

test.cfm

<cfset propertyValue = application.getProperty("siteName") /> 
<cfdump var="#propertyValue#" /> 
+0

Спасибо, Грег. По сути, это одна база кода, которая будет запускать несколько веб-сайтов и изменяться в зависимости от URL-адреса. Таким образом, конкретный сайт будет иметь информацию, специфичную для себя (например, имя сайта). –

+0

Спасибо за дополнительную информацию Том. Я обновил ответ выше. Не уверен, что лучший способ управлять несколькими сайтами с единой базы кода, но надеюсь, что это поможет вам по пути. – sqrl0

+0

Спасибо, Грег. Это здорово, он отвечает на вопрос, а также дает лучший способ сделать это. –

2

По умолчанию GetProperty будет видимым в области Variables уже, этого может быть достаточно для многих обычаев (в шаблонах .cfm).

Если вы хотите использовать эти методы непосредственно в компонентах, ссылка на них в области приложения прекрасна.

Хотя я делаю это с областью запроса в onRequestStart(), это только мои личные предпочтения. Что-то вроде этого:

request.udf = {}; 
request.udf.halt = halt; 

Пожалуйста, обратите внимание, что лучшие практики в целом incapsulating объекты и имеющие их ссылки в переменных объема хост-объекта. Обычно я делаю это при инициализации объекта, просто передавая ранее созданные объекты в качестве аргументов init().

P.S. В настоящее время рекомендуется использовать строчные буквы для тегов и их атрибутов. Вид хорошей практики кодирования.

+0

Мы используем onRequestStart, который, я считаю, автоматически не помещает функцию в область переменных. –

+0

Если вы имеете в виду мое первое предложение, CF делает это по умолчанию просто потому, что вы создали метод в Application.cfc – Sergii

+0

Эта ссылка объясняет, что я говорю. По сути, вызывающий cfm будет иметь только функции в области переменных, если вы используете метод onRequest, потому что он использует cfinclude: http://www.bennadel.com/blog/805-ColdFUsion-Application-cfc-OnRequest-Creates-A- Component-Mixin.htm –

0

Вы могли бы рассмотреть возможность создания отдельного «свойство» CFC и instanciating как синглтона в SERVER объеме, то он будет доступен с любой страницы CFML даже , если он не является частью приложения. Если вы идете по этому маршруту, то нет привязки к серверу . Вместо этого вы можете поместить это в застройщик из Application.cfc или в теле application.cfm кода

<cfif not structkeyexists(server,"properties")> 
     <cflock name ="loadProperties" 
      timeout ="10" 
      type ="exclusive" 
     > 
      <cfif not structkeyexists(server,"properties")> 

       <cfset server.properties = 
        createObject("component","path-to-props.cfc") 
        .init({..inital properties..}) 
       > 
      </cfif> 
     </cflock> 
    </cfif> 

Замок для предотвращения накладных расходов создания и назначения ОДС по каждому запросу. Это также позволяет экземпляр свойства сохраняться, так что наличие функции в properties.SetProperty() будет работать

0

Вы могли бы также ва nt использовать обсуждаемую технику here

Смежные вопросы