可重复使用的Grails控制器辅助方法

时间:2014-05-17 09:12:04

标签: grails

如何创建可在多个控制器中使用的可重用Grails控制器辅助方法?

对,不是我在一个控制器中有很少的私有方法。我想与其他控制器分享。

我想访问 params 重定向等。

3 个答案:

答案 0 :(得分:4)

在控制器之间共享代码的正确方法是将逻辑抽象为服务。见

http://grails.org/doc/latest/guide/services.html

请注意,如果服务不需要是交易服务,则应将其标记为此类服务。

但是,如果您具有与Web相关的逻辑(例如将模板或标记写入输出流),那么您还可以使用标记库来共享逻辑,因为可以从控制器调用标记。参见:

http://grails.org/doc/latest/guide/theWebLayer.html#tagsAsMethodCalls

答案 1 :(得分:2)

您可以使用Mixins来放置所有常用代码:

// File: src/groovy/com/example/MyMixin.groovy
class MyMixin {
    private render401Error() {
        response.status = 401
        def map = [:]
        map.message = "Authentication failed"

        render map as JSON
    }
}

现在在控制器中你可以这样做:

// File: grails-app/controller/com/example/OneController.groovy
@Mixin(MyMixin)
class OneController {
    public someAction() {
        if (!user.isAuthenticated) {
            // Here we're using the method from the mixin
            return render401Error()
        }
    }
}

最后一条建议:在运行时应用Mixins,因此有一点开销。

答案 2 :(得分:1)

最简单的答案是使用一堆静态方法在src中创建一个类并将所有内容作为参数传递,请参阅:http://grails.org/doc/2.3.8/guide/single.html#conventionOverConfiguration

...或者创建一个所有其他控制器扩展的控制器基类?

那就是说,我想知道你是否真的在寻找范围内的服务?请参阅http://ldaley.com/post/436635056/scoped-services-proxies-in-grails