4

我有一个过滤器设置,它运行一个检查用户会话是否存在于某些操作的函数,就像这样;

<cffunction name="init">

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

    </cffunction>

问题是,这些是动作名称......与我拥有的其他控制器冲突。

例如,我有 2 个控制器“用户”和“链接”。其中每一个都有一个名为 create 的操作,因此我的 URL 如下所示:

/用户/创建/ /链接/创建/

过滤器如何知道与哪个控制器关联?有没有办法在“except”子句中为某些“动作”加上控制器名称的前缀?

例如,也许是这样的:

<cffunction name="init">

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

    </cffunction>

我记得尝试过这个,但它没有用而且很糟糕。

希望你明白我在这里说什么。我不想为单独的控制器中的每个操作命名完全唯一的名称。

谢谢,迈克尔。

4

1 回答 1

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运行,那么它不应该传递一个值 for checkLoginExcept

<!--- controllers/Foo.cfc --->
<cffunction name="init">
    <cfset super.init()>
</cffunction>
于 2012-04-26T13:39:58.930 回答