Как правильно назначить общий udf для application.cfc? - PullRequest
2 голосов
/ 15 марта 2010

Я просто хочу определить функцию в 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>
.
.
.

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

Ответы [ 4 ]

2 голосов
/ 16 марта 2010

Лучшим способом хранения данных конфигурации сайта, вероятно, будет создание нового компонента с именем, например, 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#" />
2 голосов
/ 15 марта 2010

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

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

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

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

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

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

0 голосов
/ 16 марта 2010

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

0 голосов
/ 15 марта 2010

Вы можете рассмотреть возможность создания отдельного "свойства" CFC и создания его экземпляра как синглтон в области SERVER, то он будет доступен с любой страницы CFML даже если это не часть приложения. Если вы идете по этому маршруту, то нет "сервера start »для привязки. Вместо этого вы можете поместить это в конструктор application.cfc или в теле приложения. 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>

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

...