如何创建可在多个控制器中使用的可重用Grails控制器辅助方法?
对,不是我在一个控制器中有很少的私有方法。我想与其他控制器分享。
我想访问 params ,重定向等。
答案 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。