Ответ 1
Есть несколько вариантов, чтобы заставить это работать. К сожалению, изучение их принесло мне много проб и ошибок. Позвольте мне поделиться тем, что я узнал.
Сначала, вы можете использовать классический метод создания сопоставления в вашем CF-администраторе. Укажите точный путь к вашим компонентам (например, c:\wwwroot\cfc
) и сопоставление (псевдопапка), на которое вы хотите называть его (например, MyCFCs
). Теперь из любого места приложения вы можете ссылаться на создание new MyCFCs.mycomponent()
(используя ключевое слово CF9 + new
, вы можете заменить createObject ( "компонент", "MyCFCs.mycomponent" ) на совместимость с CF6).
Недостатки использования сопоставления серверов - это то, что вы должны настроить это на каждом сервере, на котором работает ваше приложение. У меня обычно есть локальный сервер разработки, который имеет принципиально другую конфигурацию с моих производственных серверов, и внесение изменений на рабочих серверах является для меня болью, поэтому я стараюсь избегать сопоставлений серверов, когда это возможно.
Второй, вы можете ссылаться на свои CFC с корневого относительного пути, что означает, что если ваше приложение находится в корневом каталоге вашего сервера, а путь /cfc
находится вне сети root, вы всегда можете сделать new cfc.mycomponent()
из любого места приложения. ColdFusion 6.1 и выше будут правильно отображаться в корне вашего веб-сайта. Это похоже на ссылку на изображение с помощью /images/mypicture.jpg
, где бы вы ни находились на своем веб-сайте, /images
перейдет прямо в тот же каталог.
Недостатком использования корневого относительного пути является то, что если ваше приложение будет когда-либо находиться в другой папке с корневого веб-сайта или когда-либо будет в подкаталоге, а иногда и в корневом каталоге Интернета, относительный путь из корня сети изменится, нарушив эти ссылки.
Третий, вы можете создать сопоставление приложения. Это было введено в CF8 и требует наличия файла Application.cfc
. Это просто добавить. У Раймонда Камдена отличная ссылка. Синтаксис в основном такой.
<cfset this.name = "MyAppName"/>
<cfset this.mappings = structNew() />
<cfset this.mappings["/cfc"] = getDirectoryFromPath(getCurrentTemplatePath()) & "cfc/" />
Единственным недостатком этого метода является то, что ваш Application.cfc не может распространять CFC в сопоставленной папке. Это неясная проблема, которая, вероятно, не повлияет на вас. Кроме того, вам нужно будет иметь Application.cfc, что является хорошей практикой, но я не знаю, если вы еще это делаете.
Четвертый, вы можете создать свой CFC в своей области приложения, возможно, из вышеупомянутого Application.cfc, внутри метода OnApplicationStart()
. Это мгновенно переводит любое время компиляции/создания в ваше приложение и удаляет его из последующих обращений. Код очень прост.
<!--- from Application.cfc, inside onApplicationStart() --->
<cfset application.myComponent = new cfc.myComponent() />
<!--- from anywhere else in your application --->
<cfset application.myComponent.callMyMethod() />
Недостатком этого является то, что после того, как ваш компонент находится в памяти приложения, любые изменения, внесенные вами во время разработки вашего приложения, не будут отображаться до тех пор, пока вы не очистите память приложения или не вызовите onApplicationStart() еще раз. Это не сложно обойти, но это просто больше кода и многое другое для управления.
В последней заметке, вы можете подумать о переходе с <cfinvoke>
на createObject("component",...)
или, если вы находитесь на CF9, new
. Синтаксис cfinvoke прекрасен, но каждый раз, когда вы вызываете компонент из пути, вы повторно создаете его, и это также не очень объектно-ориентированный способ вызова ваших компонентов. Пища для размышлений, возьмите ее или оставьте:)