タグでコンポーネントのパスを指定する方法はありますか?
アプリケーションに ColdFusion コンポーネントを使用しています。しかし、私のアプリケーションにはいくつかのフォルダがあり、CFC を機能させるたびに、アクセスが必要なファイルと同じディレクトリに保存する必要があります。これにより、同一の CFC ファイルがいくつか作成されます。
CFC を 1 つのディレクトリに保存して、サイト全体で機能させる方法はありますか?
タグでコンポーネントのパスを指定する方法はありますか?
アプリケーションに ColdFusion コンポーネントを使用しています。しかし、私のアプリケーションにはいくつかのフォルダがあり、CFC を機能させるたびに、アクセスが必要なファイルと同じディレクトリに保存する必要があります。これにより、同一の CFC ファイルがいくつか作成されます。
CFC を 1 つのディレクトリに保存して、サイト全体で機能させる方法はありますか?
他の人が指摘したように、アプリケーションのルートを見つけるマッピングと関数を使用して興味深いことを行うことができますが、質問の中心は一般的なパスの指定です。
Using ColdFusion ComponentsドキュメントのSpecifying the CFC locationというタイトルの部分を読むことをお勧めします。
基本的に、アプリケーションがhttp://example.com/myApp/にあり、http://example.com/myApp/foo/bar/fubar.cfmにコンポーネント:
/myApp/foo/components/library/fubar.cfc
その場合、fubar.cfm は次のようにする必要があります。
<cfset fubar=createObject("component", "myApp.foo.components.library.fubar") />
ファイルのパスを取得し、スラッシュをドット (別名「ドット表記」) に置き換え、ロードするコンポーネントのファイル名から「.cfc」を削除します。
さらに、(Aaron が説明したように) 名前付きマッピングを使用できるため、/components
そのポイントを指すという名前のマッピングを作成すると/myApp/foo/components/
、createObject 呼び出しは次のようになります。
<cfset fubar = createObject("component", "components.library.fubar") />
属性<cfinvoke />
の一部として、同じドット表記パスを使用できます。component
<cfinvoke component="components.library.fubar" ... />
ここでできることがいくつかあります。コンポーネントを適切な場所 (root/com、root/models など) に配置し、アプリケーション ベースから参照することをお勧めします。
ColdFusion アドミニストレータでは、アプリケーション ルートへのマップ パスを設定し、そのパスからコンポーネントを参照できます。
myObject = createObject('component','nameOfMyMapping.models.service.answerStackOverflowQuestions');
Application.cfm / Application.cfc でいくつかのロジックを実行して、アプリケーションのルートを動的に見つけることもできます。この方法は特別な権限を必要とせず、アプリケーションを別の環境に再配置する場合に機能します。簡単な Google は、まさにこれを行う機能を備えた Peter Freitag によるブログ投稿を見つけました。Application .cfcを使用している場合は、必ず.cfmを置き換えてください。http://www.petefreitag.com/item/630.cfm
CFLib.org には、ルート パスを見つける方法もあります。http://www.cflib.org/udf/GetRootPath
ルート パスを変数に格納すると、作業が簡単になります。
myObject = createObject('component','#myRoot#.models.service.answerStackOverflowQuestions');
最後に、多くのフレームワークでは、これや他の多くの一般的なタスクが非常に単純になっています。ほぼすべての ColdFusion フレームワークを選択できます。誰かがすでに車輪を発明しました;)。
楽しむ!
/
lib/
DataAccess.cfc
IndexingService.cfc
app/
Application.cfc
index.cfm
/app/Application.cfc
component {
root = goUpDirectory(2, GetCurrentTemplatePath());
This.mappings["/lib"] = "#root#/lib";
This.mappings["/app"] = "#root#/app";
function goUpDirectory(levels, path) {
for(levels = levels; levels >= 1; levels -= 1) {
path = GetDirectoryFromPath(path);
path = Left(path, Len(path) - 1);
}
return path;
}
}
/app/controllers/UsersController.cfc
component {
...
da = new lib.DataAccess();
...
}
上記と同じですが、の代わりに、などの代わりに使用しCreateObject
ます。new
<cfcomponent />
component { }