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/error/notFound.gsp बनाने की आवश्यकता होगी।

पहला यूआरएल मैपिंग सुनिश्चित करता है कि आपकी ओवरराइड कार्रवाई कहा जाता है। दूसरे नियंत्रक मूल नियंत्रक के लिए अन्य सभी मार्ग। और तीसरा पहुंच के लिए तीसरा 404 भेजता है।

+0

बर्ट, यदि प्लगइन '404" (देखें: '/ error') को परिभाषित करता है, तो क्या मैं इसे अपने स्वयं के "404" मैपिंग के साथ ओवरराइड कर सकता हूं, लेकिन इसके बजाय कस्टम नियंत्रक में एक क्रिया के लिए? – raffian

0

मैं मूल वर्ग को उपclass और आपके इच्छित व्यवहार को ओवरराइड कर दूंगा। मैं एक और प्लगइन के साथ बहुत कुछ कर रहा हूं, और यह बहुत अच्छा काम करता है।

प्लगइन इनलाइन का उपयोग करने के लिए एक वैकल्पिक तरीका है और केवल मूल स्रोत को संशोधित करें, लेकिन इससे भी बदतर है, क्योंकि आपको अपग्रेड के साथ कोई समस्या होगी।

मैं भी निंबल का उपयोगकर्ता हूं, और यदि आपको लगता है कि आपका एक्सटेंशन दूसरों द्वारा उपयोग किया जा सकता है, तो आप योगदान दे सकते हैं - निश्चित रूप से यह सुनिश्चित करने की कोशिश की जाती है कि यह बहुत एक्स्टेंसिबल है।

+0

जीन प्रति बनाने, मैं वास्तव में मूल नियंत्रक उपवर्गीकरण कर रहा हूँ और कुछ कार्रवाई अधिभावी लेकिन Grails अभी भी मार्ग पुराने करने के लिए मेरे अनुरोध क्रियाएं (और सबक्लास नियंत्रक कार्रवाई के लिए नहीं)। इसे काम करने के लिए, मुझे इनलाइन प्लगइन के अंदर एक्शन नाम बदलने की जरूरत है। क्या आप जानते हैं कि Grails को किसी अन्य के बजाय एक नियंत्रक कार्रवाई का उपयोग करने के लिए कैसे मजबूर करना है? – fabien7474

2

Grails 1.3.7 और Nimble प्लगइन 0.4 के साथ मैंने पाया कि बर्ट के 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  
    } 
} 
संबंधित मुद्दे

 संबंधित मुद्दे