Как расширить / переопределить действия контроллера плагинов? - PullRequest
7 голосов
/ 01 февраля 2010

Плагин (Nimble 0.3), который я использую в своем приложении Grails, включает в себя некоторые контроллеры и связанные действия. Я хочу (немного) изменить поведение некоторых действий , и мне было интересно, как мне этого добиться.

Могу ли я создать дочерний контроллер , который наследуется от моего подключаемого контроллера и переопределить некоторые реализации действия?

Или я могу создать другой контроллер с тем же именем , что и у подключаемого контроллера, но расположенный в другом пакете?

Ну, на самом деле мне действительно нужно понять: как Grails определяет, какое действие контроллера вызывать при конфликтах имен?

Ответы [ 3 ]

8 голосов
/ 07 февраля 2010

Если у вас есть плагин-контроллер с именем PluginController и действие «foo», которое вы хотите переопределить, вы можете создать подкласс контроллера:

class MyController extends PluginController {

   def foo = {
      ...
   }
}

но вам нужно будет поработать в 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")
   }
}

и это зависит от контроллера ошибок:

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'
   }
}

, который отображает страницу 404, если вы называете старые "не отображенные" действия контроллера. Вам потребуется создать grails-app / views / errors / notFound.gsp, чтобы отобразить соответствующую страницу 404.

Первое отображение URL-адреса гарантирует, что ваше переопределенное действие вызывается. 2-й направляет все остальное на оригинальный контроллер. А третий отправляет 404 для прямого доступа.

2 голосов
/ 22 марта 2011

С Grails 1.3.7 и плагином Nimble 0.4 я обнаружил, что решение Burt's UrlMapping не работает для меня. Однако, простое создание контроллера, который подклассирует контроллер плагина и имеет то же имя, сработало, согласно другому ответу Берта

class AuthController extends grails.plugins.nimble.core.AuthController{

    private static String TARGET = 'grails.plugins.nimble.controller.AuthController.TARGET'

    def login = {
        // custom logic here    
    }
}
0 голосов
/ 03 февраля 2010

Я бы создал подкласс исходного класса и переопределил бы необходимое вам поведение. Я делаю много этого с другим плагином, и он прекрасно работает.

Альтернативный способ - это, конечно, использовать встроенный плагин и просто изменять исходный код, но это еще хуже, поскольку у вас возникнут проблемы с обновлениями.

Я также пользователь Nimble, и если вы думаете, что ваше расширение может быть использовано другими, то вы можете внести свой вклад - nimble определенно постарался сделать его очень расширяемым.

...