Application.cfc расширяет значения в дочернюю папку

В настоящее время я обновляю некоторые из своих приложений Coldfusion и ищу хороший способ сохранить часть структуры на месте.

В настоящее время его установка такая

ApplicationRoot/Application.cfc (handles things like login, init etc..)
ApplicationRoot/Admin (I want exact same var's as parent folder, but few extra checks to ensure the user has admin rights)

В настоящее время установка работает с файлом приложения в каждом каталоге (и это работает), но она становится беспорядочной из-за повторного объявления всего, например, областей приложения/сеанса. Есть ли способ лучше?


person Señor Reginold Francis    schedule 01.10.2012    source источник
comment
У Шона Корфилда есть запись в блоге о расширении вашего корневого Application.cfc. Читайте об этом здесь.   -  person Miguel-F    schedule 01.10.2012
comment
Возможно, вам также захочется поискать в архивах, так как есть несколько существующих тем о расширении Application.cfc   -  person Leigh    schedule 01.10.2012


Ответы (3)


В Application.cfc в подкаталоге администратора расширьте подкаталог в родительском каталоге, например:

component extends="ApplicationProxy" {

    // eg: if you need to do something different in the local onApplicationStart:
    public void function onApplicactionStart(){
        super.onApplicationStart();
        // stuff that's different from the parent goes here
    }    

    // if there's nothing different for a given handler, then don't have one in here: the super one will still fire

    // otherwise override each handler in a similar fashion to the onApplicationStart above, with:
    // a) a call to its super equivalent
    // b) anything that needs overriding

}

В вашем базовом каталоге добавьте ApplicationProxy.cfc, таким образом:

component extends="Application" {

}

Причина этого в том, что суб Application.cfc не может иметь extends="Application", потому что это похоже на циклическую ссылку. Однако нет лучшего «квалифицированного» способа идентификации Application.cfc в базовом каталоге, поэтому нужен прокси.

person Adam Cameron    schedule 01.10.2012
comment
Я в основном сделал это (использовал сопоставление, а не ApplicationProxy, но идея та же) - person Señor Reginold Francis; 16.10.2012

Я бы попробовал что-то подобное в вашем Application.cfc на RequestStart():

<cffunction name="onRequestStart" returnType="boolean" output="false" hint="I handle page requests." >
  <cfargument name="requestname" type="string" required="true" >

  <cfif FileExists(GetDirectoryFromPath(arguments.requestname) & '/admin.cfm')>
    <cfinclude template="#GetDirectoryFromPath(arguments.requestname)#/admin.cfm">
  </cfif>
</cffunction>

Затем в каждом каталоге, в котором вы хотите настроить пользовательские переменные, поместите файл admin.cfm. В этом файле admin.cfm просто поместите несколько тегов или, как вы хотите, настроить переменные сеанса и приложения.

person Blaise Swanwick    schedule 01.10.2012
comment
Ха, я не помню, чтобы видел этот ответ здесь 21 минуту назад. :П - person J.T.; 01.10.2012

Вы также можете просто поставить галочку, чтобы увидеть, какой каталог выполняет пользователь, а затем просто запустить дополнительный код. Итак, в вашем основном application.cfc onRequestStart(), например, вы можете сказать: «Является ли текущий запрос для папки администратора?» Хорошо, запустите функцию X, которая включает все ваши функции безопасности. Вы даже можете включить этот код в качестве дополнительных функций в ваш application.cfc, если хотите.

В качестве альтернативы, если вы выберете один из других ответов, выполнив расширение, вы захотите поместить вызов super.function() в каждую функцию, где вы хотите, чтобы другой код выполнялся. Например, с запуском onRequest, super.onRequestStart() в начале вашего sub-Application.cfc onRequestStart() для вызова родительского материала до того, как дочерний элемент сработает.

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

person J.T.    schedule 01.10.2012
comment
Хотя вы МОЖЕТЕ сделать это, это как бы работает против того, как это должно быть сделано с помощью структуры приложения (например, Application.cfc). Приветствия для разъяснения супер вещи. Я забыл упомянуть об этом в своем ответе и теперь дополнил его, включив пример. - person Adam Cameron; 01.10.2012