2012-04-25 44 views
4

我有一個過濾器設置,運行一個函數,檢查用戶會話是否存在某些操作,如此;CFWheels - 發佈過濾器'except'。衝突的行動名稱

<cffunction name="init"> 

     <cfset filters(through="checkLogin", except="login,register,signin,create,home,profile") /> 

    </cffunction> 

問題是,這些是動作名稱......與其他控制器有衝突。

例如,我有2個控制器'user'和'link'。每一個都有所謂創建一個動作,讓自己的URL被像這樣:

/用戶/製作/ /連接/創建/

過濾器怎樣才能知道用哪個控制器將其與關聯?有沒有辦法在控制器名稱的'except'子句中爲某些'actions'加上前綴?

例如,可能是這樣的:

<cffunction name="init"> 

     <cfset filters(through="checkLogin", except="user/login,user/register,user/signin,link/create,main/home,user/profile") /> 

    </cffunction> 

我記得嘗試此,但它沒有工作,borked。

希望你明白我在這裏說的。我不想在單獨的控制器中爲每個動作命名完全獨特的名稱。

謝謝, 邁克爾。

回答

3

您可以使用基本的繼承來實現:

<!--- controllers/Controller.cfc ---> 
<cffunction name="init"> 
    <cfargument name="checkLoginExcept" type="string" required="false" default=""> 

    <cfset filters(through="checkLogin", except=arguments.checkLoginExcept)> 
</cffunction> 

然後在所有子控制器(user,例如),您可以指定要排除的行動。這很有效,因爲父母管理員應該對其子女一無所知。它實現了它所關心的內容而沒有其他任何東西。

<!--- controllers/User.cfc ---> 
<cffunction name="init"> 
    <cfset super.init(checkLoginExcept="login,register,signIn,profile")> 
</cffunction> 

如果另一個孩子總是想爲checkLogin運行,那麼它不應該爲checkLoginExcept傳遞一個值:

<!--- controllers/Foo.cfc ---> 
<cffunction name="init"> 
    <cfset super.init()> 
</cffunction> 
+0

感謝 - 這也正是我一直在尋找!我從來沒有想過CFC的整個繼承方面......這是一個很好的建議。 – 2012-04-27 11:19:09