【问题标题】:Reusable Grails controller helper methods可重用的 Grails 控制器辅助方法
【发布时间】:2014-05-19 20:35:16
【问题描述】:

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

是的,我在一个控制器中几乎没有私有方法。我想与其他控制器共享它们。

我想访问 paramsredirect 等。

【问题讨论】:

    标签: grails


    【解决方案1】:

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

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

    请注意,如果服务不需要是事务性的,则应将其标记为事务性。

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

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

    【讨论】:

      【解决方案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()
              }
          }
      }
      

      最后一个建议:在运行时应用 Mixin,所以会有一点开销。

      【讨论】:

      • 请注意,较新的方法是通过"traits"
      【解决方案3】:

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

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

      也就是说,我想知道您是否真的在寻找范围服务?见http://ldaley.com/post/436635056/scoped-services-proxies-in-grails

      【讨论】:

      • +1 用于其他控制器扩展的抽象基类 - 这就是我在我的一个应用程序中处理类似情况的方式,并且效果很好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 2011-08-03
      • 2012-02-13
      • 2010-12-10
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      相关资源
      最近更新 更多