我希望能够创建全局函数,这意味着我可以跨控制器使用的函数,有点像辅助方法。
所以在一个控制器中我可以做到
useful_function(string)
等等......这可能吗?
我确实在 src/groovy 中创建了一个名为 的类SiteHelper
,我在正确的轨道上吗?我希望类的方法SiteHelper
能够在整个控制器中使用。
是的,你基本上是在正确的轨道上。您可能希望将其作为服务层的一部分。
您可以将其添加到所有控制器类的元类中,例如BootStrap.groovy
:
class BootStrap {
def grailsApplication
def init = { servletContext ->
for (cc in grailsApplication.controllerClasses) {
cc.clazz.metaClass.useful_function = { String s ->
return ...
}
}
}
}
在 Grails 中,不同组件之间共享逻辑的标准方法是将其放入服务中,或者在需要访问 web 层内容(如请求/响应/参数/会话/闪存)的功能的情况下,将其放入 taglib 中。您可以从任何控制器操作中调用 taglib 标签作为方法:
MyTagLib.groovy
class MyTagLib {
def sayHello = { attrs, body ->
out << "Hello ${attrs.name}"
}
}
MyController.groovy
def someAction() {
def greeting = sayHello(name:"Ian")
// ...
}
我不明白这有什么重要的。这听起来正是 Apache 的StringUtils
类或IOUtils
类所做的。是的,SiteHelper
使用静态方法创建并导入它会做你想做的事,这是受 Java 影响(和许多其他)语言的典型做法。