我有一个过滤器设置,它运行一个函数来检查某些操作是否存在用户会话,如此;
<cffunction name="init">
<cfset filters(through="checkLogin", except="login,register,signin,create,home,profile") />
</cffunction>
问题是,这些是动作名称......与我的其他控制器发生冲突。
例如,我有2个控制器'用户'和'链接'。其中每个都有一个名为create的动作,所以我的URL就像这样:
/用户/创建/ /链接/创建/
过滤器如何知道与哪个控制器关联?有没有办法在'except'子句中使用控制器名称为某些'actions'添加前缀?
例如,可能是:
<cffunction name="init">
<cfset filters(through="checkLogin", except="user/login,user/register,user/signin,link/create,main/home,user/profile") />
</cffunction>
我记得试过这个,但它不起作用并且不知所措。
希望你能理解我在这里说的话。我不想在单独的控制器中将每个动作命名为完全唯一的名称。
谢谢, 迈克尔。
答案 0 :(得分: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>