1

現在、FW/1 ビューで「部分」の概念を使用しています。異なるビューで再利用できるレイアウトのこれらのチャンクです。メンテナンスを容易にするためにアンダースコアがプレフィックスとして付けられていますが、CFWheels とは異なり、これらは依然として暗黙的なビューとして使用できるため、あまり良くありません。

たとえば、次のディレクトリ構造があります。

/views/member/_user.cfm
/views/member/profile.cfm
/views/member/register.cfm

このように、実際のユーザー フォームは _user.cfm にあり、 を使用して他の 2 つのフォームに含めることができます#view('member/_user')#

私が欲しいのはmember._user、ウェブサイトのようなページへのアクセスを防ぐことです。

_user1 つの解決策は、コントローラーでメソッドを作成し、member.cfcユーザーをどこかにリダイレクトすることです。しかし、パーシャルごとにそのようなメソッドを作成するのは、非効率的なアプローチです。

これに代わる方法は、rc.actioninを解析しbeforeて、プレフィックスにアンダースコアがあるかどうかを確認することですが、これがクリーンなソリューションかどうかはわかりません。

コントローラーに対応するメソッドがない場合、アクションを無効にする (404 をスローする) ことは可能ですか? または、「メソッドが見つからない」状況を処理できるようにするフレームワークイベント/フラグがいくつかあるのでしょうbeforeか?

ありがとうございました。

4

4 に答える 4

2

これを行う最も簡単な方法は、それらを Web ルート以外のフォルダーに配置することです。したがって、それらは Web アクセスできません。次に、ColdFusion マッピングを使用して、それらを ColdFusion で使用できるようにします。

わかる?

于 2012-06-01T05:17:29.740 に答える
2

rc.action をチェックして、項目部分が _ で始まり、別の場所にリダイレクトされるかどうか (またはエラーをスローするか、何をしたいか) を確認するコントローラーでメソッドを作成できます。次に、Application.cfc のsetupRequest()メソッドでcontroller()関数を使用してこのメ​​ソッドを呼び出します。

たとえば、次のようにcheckItem()メソッドを持つcontrollers/security.cfcコントローラーがあります。

function checkItem( rc ) {
    //check if restricted item hss been requested and redirect to main.default
    if ( left(variables.fw.getItem(), 1) eq "_" ) {
        variables.fw.redirect('main');
    }
}

Application.cfc の setupRequest() で呼び出します。

function setupRequest() {
    //controller( 'security.authorize' );
    controller( 'security.checkItem' );
}

このように、すべてのリクエストで自動的に呼び出されます。コントローラーで _item ごとに個別のメソッドを定義する必要はありません。

于 2012-05-31T15:11:25.483 に答える
1

mod_rewriteを使用して、必要に応じて、を含むURLを検出/_し、ブロック/リダイレクトすることができます。

例えば:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/\w+/_
RewriteRule ^.* /error/404 [L]


最初のRewriteCondは、ファイルが存在しないことを確認します。したがって、実際のファイルがある場合/css/_default.css、その要求はこの条件に失敗し、リダイレクトされません。

2番目のRewriteCondは、最初のセグメントの任意の英数字を受け入れ、2番目のセグメントの先頭にが存在する場合は続行_します。(URI全体を一致させる必要はありません。開始だけで十分です。)

最後に、RewriteRuleは、両方の条件が真である場合にのみ適用されますが、すべてのURLに一致し、サーバー側のリダイレクトを実行します/error/404。必要に応じて、その部分を更新できます。([L]フラグは、mod_rewriteにそれ以上の書き換えを試行しないように指示します。)

于 2012-05-31T15:47:19.857 に答える
0

OK、私が期待していた回答がないので (これで問題ありません)、メール テンプレートに既に使用しているもう 1 つのアプローチを次に示します。

すべてのビューでは、/views/emails/アクションを持たない電子メール テンプレートがありますが、次のようにのみ呼び出されます。

local.body = variables.fw.view("emails/registration_confirmation", local.attrs);
local.template = variables.fw.view("emails/default", {body = local.body});

registration_confirmation.cfm特定の電子メール本文のテンプレートはどこにあり、 default.cfm(別の呼び方をすることができます) 電子メール テンプレート自体はどこにありますか。

質問で説明した問題を防ぐために、コントローラーemails.cfcは次のようになります。

component extends="components.helpers.controller" {

    public void function before(required struct rc) {
        variables.fw.redirect("user.forbidden");
    }

}

partials.cfcそのようなコントローラーをもう 1 つ作成し、すべてのビューを に保持することは可能だと思います/views/partials/

しかし、これは私の最初の実際の FW/1 プロジェクトであり、非常に多くのビュー (1) をリファクタリングするには遅すぎるアイデアを思いつきました。さらに、同じディレクトリにパーシャルを配置することは、メンテナンスの観点から、それが作成された場所に配置するよりも悪いと思います。それらを理解してください(2)。

これらが、私がこの質問をした理由の 2 つです。

于 2012-06-01T06:28:10.277 に答える