7

플러그인 (Nimble 0.3) Grails 애플리케이션에서 사용하고 있으며 일부 컨트롤러와 관련 작업이 포함되어 있습니다. 일부 동작 동작 (약간)을 변경하고 싶습니다.을 어떻게 구현할 수 있는지 궁금합니다.플러그인의 컨트롤러 동작을 확장/재정의하는 방법은 무엇입니까?

내 플러그인 컨트롤러에서 상속받은 하위 컨트롤러 하위 컨트롤러를 만들고 일부 동작 구현을 재정의 할 수 있습니까?

또는 다른 컨트롤러에 같은 이름을 가진 다른 컨트롤러 을 만들 수 있습니까? 그렇지만 다른 패키지에 있습니까?

실제로 실제로 이해해야하는 내용은 다음과 같습니다. 이름 충돌이있을 때 Grails가을 호출 할 컨트롤러 작업을 결정하는 방법은 무엇입니까?

답변

8

당신이 플러그인 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 페이지가 표시됩니다. 적절한 404 페이지를 표시하려면 grails-app/views/errors/notFound.gsp 파일을 만들어야합니다.

첫 번째 URL 매핑은 재정의 된 작업이 호출되도록합니다. 두 번째는 원래 제어기에 대한 다른 모든 것입니다. 그리고 세 번째는 직접 액세스를 위해 404를 보냅니다.

+0

Burt, 플러그인이''404 "(view : '/ error')'를 정의하면, 내 자신의"404 "맵핑으로 오버라이드 할 수 있습니까? 대신 커스텀 컨트롤러의 액션으로 대체 할 수 있습니까? – raffian

0

원래 클래스를 서브 클래스로 만들고 필요한 동작을 재정의합니다. 다른 플러그인을 사용하여 많은 작업을하고 있으며 효과가 좋습니다.

또 다른 방법은 플러그인을 사용하여 원본 소스를 수정하는 것입니다.하지만 업그레이드하는 데 문제가 있으므로 원본 소스를 수정하는 것이 좋습니다.

나는 민첩성의 사용자이기도합니다. 다른 사람이 내선 번호를 사용할 수 있다고 생각한다면 기여할 수 있습니다. 민첩성은 확실히 확장 성이 있는지 확인하려고 시도합니다.

+0

장 당 모두 서브 클래스 플러그인 컨트롤러와 일 같은 이름을 가진 컨트롤러를 생성 Grails는 여전히 경로 이전에 내 요청 액션 (서브 클래스 컨트롤러 액션이 아님). 작동 시키려면 인라인 플러그인 내부에서 액션 이름을 변경해야했습니다. Grails가 다른 컨트롤러 액션 대신 컨트롤러 액션 하나를 사용하게하는 방법을 알고 있습니까? – fabien7474

2

Grails 1.3.7과 Nimble Plugin 0.4를 사용하여 Burt의 UrlMapping 솔루션이 제대로 작동하지 않는 것으로 나타났습니다. 그러나, 단순히 내가 실제로 원래의 컨트롤러를 서브 클래스와 몇 가지 조치를 무시하지만하고, 버트의 other answer

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

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

    def login = { 
     // custom logic here  
    } 
}