如何扩展/覆盖插件的控制器动作?

fab*_*474 7 model-view-controller grails inheritance grails-plugin grails-controller

我在grails应用程序中使用的插件(Nimble 0.3)包括一些控制器和相关的操作.我想(稍微)改变一些动作行为,我想知道如何实现这一点.

我可以创建一个继承自我的插件控制器的子控制器并覆盖一些动作实现吗?

或者,我可以创建另一个插件控制器同名但位于不同包中的Controller 吗?

实际上我真正需要理解的是:当有名称冲突时,Grails如何确定要调用哪个控制器操作

Bur*_*ith 8

假设您有一个名为PluginController的插件控制器和一个要覆盖的动作'foo',您可以将控制器子类化:

class MyController extends PluginController {

   def foo = {
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

但你需要在UrlMappings中做一些工作:

class UrlMappings {

   static mappings = {
      "/$controller/$action?/$id?" {
         constraints {}
      }

      "/myController/foo/$id?"(controller: "myController", action: "foo")
      "/myController/$action?/$id?"(controller: "pluginController")
      "/pluginController/$action?/$id?"(controller: "errors", action: "urlMapping")

      "/"(view:"/index")
      "500"(view:'/error')
      "404"(controller: "errors", action: "notFound")
   }
}
Run Code Online (Sandbox Code Playgroud)

这取决于ErrorsController:

class ErrorsController {

   def notFound = {
      log.debug "could not find $request.forwardURI"
   }

   def urlMapping = {
      log.warn "unexpected call to URL-Mapped $request.forwardURI"
      render view: 'notFound'
   }
}
Run Code Online (Sandbox Code Playgroud)

如果您调用旧的"未映射"控制器操作,则会呈现404页面.您需要创建grails-app/views/errors/notFound.gsp来显示相应的404页面.

第一个url映射确保调用重写的操作.第二个将其他所有内容路由到原始控制器.第3个发送404s直接访问.