2012-05-31 49 views
1

目前,我在FW/1視圖中使用「partials」概念:這些可以由不同視圖重新使用的佈局塊。它們以下劃線作爲前綴以便於維護,但與CFWheels不同的是,它們仍然可以用作不太好的隱式視圖。在沒有控制器方法的情況下隱藏FW/1動作

例如,有一個目錄結構:

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

這樣實際用戶的形式是在_user.cfm,並且可以包括使用#view('member/_user')#兩個人。

我想要的是阻止訪問網站上的member._user這樣的頁面。

一種解決方案是在member.cfc控制器中創建_user方法,並將用戶重定向到某處。但是爲每個部分創建這樣的方法是一種低效的方法。

替代此將解析rc.actionbefore並檢查前綴是否有下劃線,但我不確定這是乾淨的解決方案。

如果控制器中沒有相應的方法,是否可以禁用該操作(拋出404)?或者也許有一些框架事件/標誌可以讓我處理before中的「缺失方法」情況?

謝謝。

+0

我認爲你可以將_user()設置爲私有,但是我還沒有碰到FW/1一段時間以知道這是否有效。 – Henry

+0

@亨利我可以,但這就是要點 - 我不想創建數十種空白方法(我有很多偏分量)。 – Sergii

+0

使用mod_rewrite檢測包含'/ _'的URL並根據需要阻止/重定向? –

回答

2

您可以在控制器中創建一個方法,該控制器檢查rc.action以查看項目是否以_開始並在其他地方重定向(或引發錯誤或您想要執行的任何操作)。然後使用控制器()函數在您的setupRequest()方法中調用此方法,該方法位於Application.cfc中。

例如,我有一個控制器/ security.cfc控制器checkItem()方法如下:

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定義單獨的方法。

+0

這與我在'替代這個......'開始的段落中描述的基本相同,不過謝謝任何方式。使用before()方法的 – Sergii

+0

雖然類似,但要求您在每個有限制項目的控制器的每個before()方法中重複相同的代碼;另一方面,在setupRequest()中運行它,您只有一個代碼所在的位置(我的示例代碼中的security.cfc)。 – azawaza

+0

那麼,實際上你可以在Application.cfc中的方法之前/之後。 – Sergii

1

您可以使用mod_rewrite來檢測包含/_的URL並根據需要阻止/重定向。

例如:

RewriteEngine On 

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


第一的RewriteCond確保該文件不存在 - 所以,如果你有一個真正的文件/css/_default.css的任何請求都將失敗,這種情況下,而不是重定向。

第二個RewriteCond接受第一個分段的任何字母數字,然後在第二個分段的起始處有一個_繼續。 (沒有必要匹配整個URI,只是開始就足夠了。)

最後,只有在兩個條件都爲真,但匹配所有URL並執行服務器端重定向至/error/404時才應用RewriteRule - 您可以根據需要更新該部分。 ([L]標誌告訴mod_rewrite不要嘗試進一步重寫。)

2

最簡單的方法是將它們放入不在Web根目錄中的文件夾中。因此他們不能上網。然後使用ColdFusion映射使它們可用於ColdFusion。

有意義嗎?

+0

也許會在某些情況下。但它會爲我個人增加一層複雜的存儲庫結構和工作流程和IDE(第二個項目,有效)。 – Sergii

+0

@Sergii這是實現你所要求的既定方式。你不應該創建一個新的項目。您可以擁有支持它的文件夾結構。即/ www /(這是你的webroot)/ views /(這是你的觀點去的地方),然後你將它作爲映射進行推廣。mod_rewrite路線可以工作,但它對於CF本身可以解決的問題有點大錘的方法 – baynezy

+0

我很抱歉,但事實並非如此。我們在這裏談論'FW/1',對吧?項目結構由框架定義 - 它是基於約定的。人們可以重寫它(當然),但它不是長期維護的明智選擇。例如,如果其他應用程序遵循標準結構,則會令人困惑。 – Sergii

0

好的,因爲沒有我期望的答案(這很好),下面是我用於電子郵件模板的另一種方法。

/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,並保持所有意見/views/partials/。但是這是我的第一個現實生活中的FW/1項目,我想出了很多想法來重構這麼多視圖(1),另外我認爲在維護角度上,同一個目錄中的partials更糟,而不是他們他們有意義他們(2)。

這是我問這個問題的兩個原因。

相關問題