Подтвердить что ты не робот

Сопоставление с CFC в ColdFusion

В моем приложении у меня есть все мои CFC в папке cfc. Из корня сайта я могу получить к ним доступ без каких-либо проблем, просто обратившись к ним в свой тег <cfinvoke> как component=cfc.mycomponent method=mymethod

Проблема в том, что когда я хочу получить доступ к cfc с другой страницы, а не в корне, я не могу использовать component=../.cfc.mycomponent, чтобы связаться с этим cfc.

Что я здесь делаю неправильно?

4b9b3361

Ответ 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 прекрасен, но каждый раз, когда вы вызываете компонент из пути, вы повторно создаете его, и это также не очень объектно-ориентированный способ вызова ваших компонентов. Пища для размышлений, возьмите ее или оставьте:)

Ответ 2

Вы не можете использовать относительные пути с компонентами.

Что вам нужно, это сопоставление ColdFusion. Есть два способа сделать это.

Во-первых, войдите в свой администратор ColdFusion, перейдите в раздел сопоставлений и добавьте сопоставление /cfc, указывающее на вашу папку cfc.

Другим способом является использование сопоставлений, специфичных для приложения; В приложении Application.cfc для вашего приложения вы можете добавлять сопоставления приложений, как и при сопоставлении администратора ColdFusion. В верхней части приложения cfc добавьте cfset this.mappings в виде массива. В этом массиве задается сопоставление с каталогом.

<cfset this.mappings["/cfc"] = GetDirectoryFromPath( GetCurrentTemplatePath() )&"cfc">

с отображением /cfc в вашу папку cfc любые вызовы компонентов для cfc.objectname загружают соответствующий компонент в вашу папку cfc.

Ответ 3

Убедитесь, что ваши компоненты расширяют другие компоненты, используя полный путь.

т.е. контроллер продуктов

<cfcomponent displayname="Products" hint="Handles all product requests" extends="core.controller.controller"  output="false">