Сопоставление с CFC в ColdFusion - PullRequest
12 голосов
/ 19 октября 2011

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

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

Что я здесь не так делаю?

Ответы [ 3 ]

25 голосов
/ 19 октября 2011

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

Сначала , вы можете использовать классический метод создания сопоставления в вашем CF Administrator.Укажите точный путь к вашим компонентам (например, c:\wwwroot\cfc) и отображение (псевдопапка), по которому вы хотите вызвать его (например, MyCFCs).Теперь в любом месте вашего приложения вы можете ссылаться на создание new MyCFCs.mycomponent() (используя ключевое слово CF9 + new, вы можете заменить createObject ("component", "MyCFCs.mycomponent"), чтобы он был обратно совместим с CF6).

Недостатками использования сопоставления серверов являются то, что вы должны настроить это на каждом сервере, на котором работает ваше приложение.Обычно у меня есть локальный сервер разработки, который имеет радикальную конфигурацию, отличную от моих производственных серверов, и внесение изменений на производственных серверах является для меня проблемой, поэтому я стараюсь по возможности избегать сопоставлений серверов.

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

5 голосов
/ 19 октября 2011

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

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

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

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

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

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

0 голосов
/ 01 февраля 2013

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

то есть контроллер продуктов

<cfcomponent displayname="Products" hint="Handles all product requests" extends="core.controller.controller"  output="false">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...