1

これは奇妙なものです。グーグルでこれに関する情報を見つけることができなかったので、これを見たことがある人はいないでしょうか。

リクエストスコープにCFCがあり、onRequestEndイベントで、そのCFCをリクエストスコープから取得し、リクエストの終わりを処理します。問題は、onRequestEndイベントで変数を参照できないことです。これは、スコープで定義されていないことを示すエラーが生成されるためです...しかし、ここで変数が非常に奇妙になり、これがバグであることがわかります(これは単なるバグではありません)疑惑)...変数をダンプすると、cfdumpタグはCFCとそのすべてのものを正常に表示し、同じ「スコープ内で未定義」エラーを生成します。これがスクリーンキャプチャです。

リクエスト変数のバグのスクリーンキャプチャ

だから...これを見た人はいますか?なぜなら私は完全に困惑しているからです。9.0.1アップデータと両方の累積ホットフィックスをすでにインストールしています。

psええ、OnRequestEnd.cfmと書かれていることは知っていますが、これは実際にはApplication.cfconRequestEndメソッド内にあります。これは元々CF5にまでさかのぼるフレームワークからのレガシーです。; P


編集:わかりました、それはもっと奇妙になりました...私はevaluate()を使用してそれをローカル変数に設定しようとしました、それは明らかに機能します、それから私はローカル変数をダンプするからです。エラーが発生した行の後の2目にあるにもかかわらず、ダンプは引き続き機能しますか?!!

ここに画像の説明を入力してください


編集2:編集:エラーが発生したファイルを含むApplication.cfcのコードは次のとおりです。

<cffunction name="onRequestEnd" access="public" output="true">
    <cfinclude template="OnRequestEnd.cfm">
</cffunction>

メソッドとインクルードファイルの組み合わせと関係があるようです。

onRequestStartのメソッドを次のように実行すると、まだ失敗します。

<cffunction name="onRequestStart" access="public" output="true">
    <cfset onRequestEnd() />
</cffunction>

ただし、このようにonRequestStartにファイルを含めると正常に機能します。

<cffunction name="onRequestStart" access="public" output="true">
    <cfinclude template="OnRequestEnd.cfm">
</cffunction>

でも!単純なテストケースを作成できないため、これには明らかに多くのことがあります。非常に単純なapplication.cfcを含む新しいプロジェクトを作成し、これらすべての詳細を複製すると、正常に機能します。したがって、フレームワークには、メソッド名とファイル名だけでなく、それに貢献している何かがあります。

また、ファイル名を次のように変更しても同じように失敗するため、ファイル名は実際には寄与していないようです。

<cffunction name="onRequestEnd" access="public" output="true">
    <cfinclude template="reqend.cfm">
</cffunction>

編集3:さて、それはファイルとは何の関係もありません...まあ、それはそうですが、ファイル名とは関係ありません...onRequestEnd.cfmの下部にこのコードがあります

<!--- this seems to help resolve a leaky-memory issue in CF/JRun --->
<cfset structClear(variables) />
<cfset structClear(request) />
<cfabort />

これらのStructClearステートメントをコメントアウトすると、エラーが消え、OnRequestEnd.cfmが2回実行されていたことがわかります...そしてCF9がCFABORTタグの動作を変更し、onRequestEndイベントを実行することを意味すると思いますタグが使用されている場合...以前のバージョンのcfにはありませんでした...

これに関するドキュメントは見つかりませんでしたが、CFLOCATIONタグを使用したこの動作について、Ben Nadelからこのブログを見つけたので、より一般的にはonRequestEndイベントに関するもののようです。CF9では、ページの実行がどのように終了しても、最後にonRequestEndイベントが実行されるようです...これは以前のすべてのバージョンからの変更であるため、実際にこれを発生させるために作成したコードをいじくりまわします以前のバージョンでは。onRequestEndを実行してからページを早期に中止していたため、CFはonRequestEndを実行し、中止してから、中止のためにonRequestEndを再度実行します。

幸いなことに、テンプレートの上部にあるこのかなり単純なコードで問題が解決したようです。

<cfif structIsEmpty(request)>
    <cfexit method="exittemplate" />
</cfif>
4

1 に答える 1

0

他の人に役立つかもしれないので、この質問を(削除するのではなく)ここに残すことにしましたが、いくつかのコメントを処理しているときに問題の原因と回避策を見つけましたが、それは私たちが思っていたものではありませんでした。ベン・ネーデルもしばらく前にCFABORTへの変更についてブログを投稿しました...そしてアダム・キャメロンは、この変更はCF9で設計によって追加されましたが、(LiveDocsとそれについて2つのコメントを追加しました)、それは(まだリリースされていませんか?)CF10で削除されました。アダムはベータ版になっているかもしれないと思いますが、よくわかりません。

于 2012-04-22T00:49:25.413 に答える