Плагин (Гибкие 0.3) я использую в своем приложении чаш Грааля, включает некоторые контроллеры и связанные действия. Я хочу изменить (немного) некоторое поведение действий, и я задавался вопросом, как я могу достигнуть этого.
Я могу создать дочерний контроллер, который наследовался моему сменному контроллеру, и переопределите часть реализации действия?
Или, я могу создать другой Контроллер с тем же именем как сменный контроллер, но расположенный в другом пакете?
Хорошо на самом деле то, что я действительно должен понять: как Grails определяет, какое действие контроллера назвать, когда существуют конфликты имен?
Предположим, у вас есть контроллер подключаемого модуля с именем 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")
}
}
, и это зависит от 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'
}
}
, который отображает страницу 404, если вы вызываете старую «несопоставленные» действия контроллера. Вам нужно будет создать grails-app / views / errors / notFound.gsp, чтобы отобразить соответствующую страницу 404.
Первое сопоставление URL-адресов гарантирует, что будет вызвано ваше переопределенное действие. Второй направляет все остальное к исходному контроллеру. А третий отправляет 404 для прямого доступа.
Я бы создал подкласс исходного класса и переопределил бы нужное вам поведение. Я часто делаю это с другим плагином, и он отлично работает.
Альтернативный способ - это, конечно, использовать встроенный плагин и просто изменить исходный код, но это еще хуже, поскольку у вас возникнут проблемы с обновлениями.
Я также являюсь пользователем Nimble, и если вы думаете, что ваше расширение может использоваться другими, то вы могли бы внести свой вклад - nimble, безусловно, постарался сделать его максимально расширяемым.