【发布时间】:2014-05-19 20:35:16
【问题描述】:
如何创建可在多个控制器中使用的可重用 Grails 控制器辅助方法?
是的,我在一个控制器中几乎没有私有方法。我想与其他控制器共享它们。
我想访问 params、redirect 等。
【问题讨论】:
标签: grails
如何创建可在多个控制器中使用的可重用 Grails 控制器辅助方法?
是的,我在一个控制器中几乎没有私有方法。我想与其他控制器共享它们。
我想访问 params、redirect 等。
【问题讨论】:
标签: grails
在控制器之间共享代码的正确方法是将逻辑抽象为服务。见
http://grails.org/doc/latest/guide/services.html
请注意,如果服务不需要是事务性的,则应将其标记为事务性。
但是,如果您有与 Web 相关的逻辑(例如将模板或标记写入输出流),那么您还可以使用标签库来共享逻辑,因为标签可以从控制器中调用。见:
http://grails.org/doc/latest/guide/theWebLayer.html#tagsAsMethodCalls
【讨论】:
你可以使用 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()
}
}
}
最后一个建议:在运行时应用 Mixin,所以会有一点开销。
【讨论】:
最简单的答案是在 src 中使用一堆静态方法创建一个类,并将所有内容作为参数传递,请参阅:http://grails.org/doc/2.3.8/guide/single.html#conventionOverConfiguration
...或者创建一个所有其他控制器都从其扩展的控制器基类?
也就是说,我想知道您是否真的在寻找范围服务?见http://ldaley.com/post/436635056/scoped-services-proxies-in-grails。
【讨论】: