2013-04-25 4 views
3

현재 제가 작업하고있는 프로젝트는 다양한 부분의 필터를 사용합니다. 필터 자체는 훌륭하게 작동합니다. 내가 겪고있는 문제는 필터를 실행해야하는 컨트롤러를 지정할 때 아주 큰 목록으로 끝나는 것입니다. 기능적으로는 정상적으로 작동하지만 추악하고 다소 다루기 힘들게됩니다.Grails 필터 컨트롤러 패키지

def filters = 
{ 
     filterSomething(controller:'one|two|three|...|xyz', action:'*') 
     { 
      //before filter here, not important. 
     } 
    } 

필터가 지정된 패키지 또는 패키지 목록의 컨트롤러에만 적용될 수 있음을 지정하는 방법이 있습니까?

상자 밖의 것이 없다면 무언가를 부트 스트랩에 묶고 그런 식으로 내 목록을 설정하는 것에 대해 생각하고있었습니다.

답변

2

모든 컨트롤러에 필터를 적용한 다음 패키지를 확인한 다음 원하는 것을 결정할 수 있습니다. 이 코드를 더 훌륭하고 우아한 방식으로 코딩하고 있지만 아이디어를 제공하는 것입니다.

class MyFilters { 
def grailsApplication 


def filters = { 
    all(controller:'*', action:'*') { 
     before = { 
      if (checkController(['com.package.name'],controllerName)){ 
      } 
     } 
    } 
} 


def searchInList(list,packageName){ 
    for (keyword in list) { 
     if (packageName.contains(keyword)) return true 
    } 
    return false 
} 

Boolean checkController(def includePackageList,cname) { 
    def dlist = grailsApplication.getArtefacts("Controller") 
    def filteredList= dlist.findAll{ searchInList(includePackageList,it.getPackageName()) } 
    return filteredList.contains(cname) 
} 
} 
+1

상자 밖의 것이 없기 때문에 탐험해볼 가치가 있습니다. 거대한 목록을 하드 코딩하는 것보다 더 우아합니다. 특히 목록에 새 컨트롤러를 추가하는 것을 잊어 버렸기 때문에 매우 의도하지 않은 동작이 발생합니다. 나는 성능이 문제가되지 않을 것이라고 추측하지만 결과는 잠재적으로 어떤 방식으로 캐시 될 수 있습니다. – Joseph

+0

확실하고 클래스 문자열에서 클래스 패키지 이름을 가져 오는 더 쉬운 방법이있을 수 있습니다. 그런 식으로 목록을 반복 할 필요가 없습니다. – Alidad

+0

나는 이것을하는 공식적인 방법이 있다고 생각하지 않기 때문에 합리적인 해결 방법이므로 대답을 받아 들일 것입니다. – Joseph