8

現実の確認が必要です-そしてできれば説明が必要です(私の現実が間違っている場合)。

CFアプリケーションフレームワークが物事を評価する方法はこれです(私の理解では)-リクエストはcfserverに渡されます

  • cf は application.cfm または cfc を検索します (トラバース ルールに基づく)

  • application.cfc が実行されます (見つかった場合)

  • THISスコープが設定されています (一連のアプリケーション固有の変数をここで設定できますが、

「applicationTimeout」など、いくつかは必須です。その後、一連のイベントが発生し、必要に応じてメソッドが起動されます。

-- onApplicationStart()

----onSessionStart()

------onRequestStart()

だから私の質問

1)この設定は、すべてのページ要求で発生します-他の何よりも前に?

2) onApplicationStart() でアプリケーション変数を設定した場合 - その後に発生するすべてのプロセスで使用できます - そして、applicationTimeout() の長さの間メモリに保持する必要があります - 正しいですか?

3) もし私がこのようなことをしたら...

if ( isdefined("application.myvar" ) { this.something = application.myvar; }

アプリケーションスコープを開始した最初のリクエストの後のページリクエストで機能する必要があります。

ただし、そうは見えません。

私の質問の理由はこれです-このスコープで設定する必要がある興味深いアプリケーションレバー設定がいくつかあります...それらのいくつかは「集中的」である可能性があります(少なくともすべてのリクエストで実行するという観点から-だから私はしたいですそれらを一度だけ行うには、永続メモリに構造を設定し、それらを THIS として使用できるようにします。

私はいくつかの間違った仮定をしていますか?

どうも

4

5 に答える 5

3

ColdFusion Application.cfcのドキュメントには、次のような知識があります。

リクエストが実行されると、ColdFusionはCFCメソッドを次の順序で実行します。

  1. onApplicationStart(このアプリケーションで以前に実行されていない場合)
  2. onSessionStart(このセッションの前に実行されていない場合)
  3. onRequestStart
  4. onRequest / onCFCRequest
  5. onRequestEnd

onApplicationEnd、onSessionEnd、およびonError CFCは、特定のイベントによってトリガーされます。

全体的なリクエストオーダーには、(少なくとも)さらに2つのステップがあります。

0: 0.5cfcomponentに含まれていないすべてのコードを実行します:アプリケーションを作成するためのタグと同等のものを実行しますcffunction
cfapplication

そのため、あなたの質問に対する答えは次のとおりです。

  1. 手順0でこれらの変数を設定している場合は、はい。
  2. 正しい。
  3. これは、変数を設定する場所によって異なります。変更しようとしている値がApplication.cfcのアプリケーション変数のドキュメントページにリストされている場合、それらはステップ0にある必要があります。他の場所に設定するとスコープが更新されますがthis、ステップ0.5では有効になりません。
于 2012-08-14T09:21:37.967 に答える
3

ここでは、コードが実行されるタイミングと、変数スコープが利用されるタイミングと有効期間の 2 つが関係しています。

  • メソッドのないコード (つまり、「疑似コンストラクター」) は、すべてのリクエストを実行します。明らかに、CFC のこの部分のコード量を最小限に抑えてください。
  • さまざまなイベント ハンドラーのコードは、イベント ハンドラー名で示されるように実行されます。たとえば、 onApplicationStart() コードは、アプリケーションの開始時に 1 回だけ実行されます。同上 onSessionStart() は、新しいセッションごとに 1 回だけ実行されます。

スコープ:

  • この範囲は、CFC 全体で利用できます。他の CFC の this-scope とまったく同じように動作しますが、一部の this-scoped 変数には特別な意味があります ( this.namethis.datasourceなど)。これらの特別な意味を持つ変数は、関連するハンドラーでセッションごとまたはリクエストごとに変更できますが、システム全体に適用されるようです (つまり、設定を変更する特定のセッションまたはリクエストではありません)。通常の CFC では、thisパブリック変数を公開するためにスコープが使用されますが、Application.cfc のパブリック インスタンスがないため、thisこれらの特別な設定を行う範囲を超えています。CFC 内のすべてのメソッドで変数を使用できるようにしたい場合は、変数スコープを通常どおりに使用します。ここでの誰かのアドバイスに反して、このスコープの変数はアプリケーションスコープの変数と同じではありません。
  • request スコープは、CFC 全体で使用することもできます (疑似コンストラクターおよびメソッド)。これらは、他のリクエストスコープの変数と同様に、リクエストで後で呼び出されるテンプレートの呼び出しコードでも使用できます。
  • this.name適用範囲:設定後も疑似コンストラクタでは利用できません。onApplicationStart() 以降でのみ使用可能になります。
    • セッション スコープ: 同様に、疑似コンストラクターまたは onApplicationStart()l では使用できず、onSessionStart() まで使用できません。

これについては、こちらのブログ投稿 (テスト コードを提供) で説明しました。ここに含めるには長すぎますが、上記の内容が要約されています。

于 2012-08-15T23:08:12.043 に答える
1

以下の投稿は機能するようですが、機能しないため、コメントを参照してください。このスコープをダンプすると、新しい値が表示されますが、実際にはアプリケーションの設定は変更されません。

アプリケーションの設定はどこでも変更できます。ただし、疑似コンストラクターはページが要求されるたびに実行されるため、疑似コンストラクターの実行後は常に設定を変更する必要があります。アプリケーション スコープは疑似コンストラクターでは使用できないため、onRequestStart または onRequest 関数でこれを行うことができます。onRequestStart 関数の条件ごとに customtagpaths を再割り当てする簡単なテストを行いました。ページに初めてアクセスすると、カスタム タグ フォルダは「customtags」になります。追加のリクエストでは、「someOtherCustomtagsFolder」が示されます。補足として、アプリケーション設定がユーザーごとに変更されると、グローバル アプリケーション設定が反転します。また、他のユーザーが誤った設定を取得するという問題が発生する可能性があります。

<cfcomponent>
<!--- pseudo constructor --->
<cfset this.customtagpaths = expandPath('./customtags')>

<!--- onRequestStart --->
<cffunction name = "onRequestStart" returnType="void">
     <cfif structKeyExists(application,'testSetting')>
          <cfset this.customtagpaths = expandPath('./someOtherCustomtagsFolder')>
     </cfif>
</cffunction>

<!--- onRequest --->
<cffunction name = "onRequest" returntype="void">
     <cfargument name="targetPage" type="String" required = "true" />
     <cfdump var = "#this#" label = "this">
     <cfset application.testSetting = "foo">
     <cfinclude template="#Arguments.targetPage#">
</cffunction>
</cfcomponent>
于 2012-08-14T11:50:15.057 に答える
-1

Application.cfc ファイル内のthisスコープ内のものはすべてアプリケーション変数になり、アプリケーションのライフ サイクルごとに 1 回だけ作成されます。アプリケーションの起動後、Application.cfc 内にこのユーザーは他にいません。

CF アプリケーションが初めて実行されるとき、onApplicationStart() の内容は onRequest/Start/End の前に実行されます ("CF10 の新機能" onServerStart() を除く)。

アプリケーション内の任意の場所に設定されたアプリケーション変数は、アプリケーションが停止されるまで存在します。

#3のコードは次のようになります

if ( !structKeyExists( application, "myvar" ) { application.myvar = foo; }

次に、必要な場所で application.myvar を参照します。

あなたの説明から、このスコープに何も追加する必要はありません。アプリケーションスコープに入れるだけです。

于 2012-08-13T15:08:24.097 に答える
-2

アプリケーション スコープは、Application.cfc 疑似コンストラクターでは使用できません。これは、this.name が設定されるまで、要求をアプリケーションに関連付ける方法がないためです。

アプリのマッピングを作成するオーバーヘッドが心配な場合は、利用可能なサーバー スコープにそれらをキャッシュする方法があります。

if(!structkeyexists(server, 'myappmappings')){ server.myappmappings = createMappings(); this.mappings = server.myappmappings;

cachePut/cache Get を使用してマッピングを ehcache に保存することもできますが、疑似コンストラクターでそれを試したことはありません。

于 2012-08-13T17:46:22.140 に答える