2010-06-25 12 views
6

चलो कहते हैं कि मेरे पास है चलो मेरे INI फ़ाइल में निम्नलिखित:ज़ेंड प्लगइन्स के लिए किस निर्देशिका का उपयोग किया जाता है?

resources.frontController.plugins.auth = AuthPlugin 

कहाँ AuthPlugin वर्ग रखा जाना चाहिए? मान लें कि मैं इसे नियंत्रकों/प्लगइन्स के तहत पसंद करूंगा।

अद्यतन:

नीचे मैं अभी भी समस्या आ रहा सुझाव के आधार पर। मैं क्या वर्तमान में मुझे में सही हो:

1) application.ini

includePaths.library = APPLICATION_PATH "/../library" 
bootstrap.path = APPLICATION_PATH "/Bootstrap.php" 
bootstrap.class = "Bootstrap" 
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts" 
resources.view[] = 
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" 
resources.frontController.plugins.authplugin.class = "AuthPlugin" 

2) का मुख्य हिस्सा मेरी Bootstrap.php कुछ भी नहीं है (मैं वहाँ में चीजों की बहुत सारी था, लेकिन अभी भी मिलता है कुछ भी नहीं के साथ त्रुटि):

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
} 

3) मैं आवेदन में एक AuthPlugin.php वर्ग/plugins निर्देशिका है

class AuthPlugin extends Zend_Controller_Plugin_Abstract 
{ 
    public function preDispatch(Zend_Controller_Request_Abstract $request) 
     { 
      // code here 
     } 
} 

मुझे निम्न त्रुटि मिलती है:

Fatal error: Class 'AuthPlugin' not found in C:\[my dir structure here]\Application\Resource\Frontcontroller.php on line 111 

मुझे लगता है कि मुझे कुछ स्पष्ट याद आ रहा है। अग्रिम में धन्यवाद। Zend फ्रेमवर्क 1.10

उत्तर

3

इस तरह मैं अपने आवेदन config में Foo_Plugin_SuperDuperPlugin नाम के एक प्लगइन रजिस्टर:

resources.frontController.plugins.superduperplugin.class = "Foo_Plugin_SuperDuperPlugin" 

प्लगइन
APPLICATION_PATH/plugins/Foo_Plugin_SuperDuperPlugin.php पर स्थित है और वहाँ से autoloaded है क्योंकि Resource Module Autoloader स्वचालित रूप से करने के लिए है कि (अनुशंसित) स्थान में लग रहा है प्लगइन प्रकार संसाधन। अगर मैं प्लगइन को लोड करना चाहता हूं, तो कहें,
APPLICATION_PATH/controllers/plugins/Foo_Plugin_SuperDuperPlugin.php तो मैं ऑटोलोडर के साथ एक नया संसाधन लोडर पंजीकृत करूंगा और 'प्लगइन' नामक संसाधन के प्रकार और उन प्लगइन संसाधनों के पथ को परिभाषित करता हूं। तो मेरी bootstrap.php में

protected function _initAutoloader() 
{ 
    $autoloader = new Zend_Loader_Autoloader_Resource(
     array(
      'basePath'  => APPLICATION_PATH, 
      'namespace'  => 'Foo', 
      'resourceTypes' => array(
       'plugin' => array(
        'path'  => 'controllers/plugins', 
        'namespace' => 'Plugin', 
       ) 
      ) 
     ) 
    ); 
} 

और फिर मैं यह सुनिश्चित करना है कि इस विधि से पहले SuperDuperPlugin पंजीकृत है बूटस्ट्रैप जाता है (जो, इस उदाहरण में, जब आवेदन config resources.frontcontroller.plugins.superduperplugin.class = ... पढ़ा जाता है होता है) की जरूरत है। Bootstrap.php के शीर्ष पर _initAutoloader विधि रखकर या किसी भी अन्य _init विधि से $this->bootstrap('autoLoader'); पर कॉल करके, फ्रंटकंट्रोलर संसाधन प्रारंभ होने से पहले इसे प्राप्त किया जा सकता है।

UPDATED: अपने बूटस्ट्रैप को यह जोड़ने का प्रयास करें:

protected function _initAutoloader() 
{ 
    $autoloader = new Zend_Loader_Autoloader_Resource(
     array(
      'basePath'  => APPLICATION_PATH, 
      'resourceTypes' => array(
       'plugin' => array(
        'path'  => 'controllers/plugins', 
        'namespace' => '', 
       ) 
      ) 
     ) 
    ); 
} 

और शायद नाम स्थान बंद रखना होगा। या: appnamespace = "Foo" अपनी कॉन्फ़िगरेशन में जोड़ें और कक्षा को Foo_Plugin_AuthPlugin पर पुनर्नामित करें।

+0

मुझे कुछ गलत करना होगा, क्योंकि मैं इसे काम पर नहीं ला सकता हूं। मैं अधिक जानकारी के साथ मूल प्रश्न अद्यतन कर रहा हूं। –

+0

मैंने अपना जवाब अपडेट कर दिया है। – jah

+0

मैं इसे संसाधन जोड़ के साथ काम कर सकता हूं, लेकिन आखिरकार इसे मूलभूत 'नियंत्रकों/AuthPlugin.php' के साथ काम करना पड़ा; (या जो भी डीआईआर मैंने इसे रखा है) _initAutoloader() विधि में। –

0

मैं/आवेदन/plugins में लगता है/

लेकिन क्या आप भी इसके लिए एक निर्देशिका सेट कर सकते हैं।

+0

धन्यवाद, लेकिन है कि काम करने के लिए प्रतीत नहीं होता। ऐसा हो सकता है कि मेरा ऑटोलोडिंग इस प्रकार के वर्ग के लिए सही काम नहीं कर रहा है, लेकिन यह मेरे एथप्लगिन क्लास को नहीं ढूंढ सकता है, चाहे मैं इसे एप्लिकेशन/प्लगइन्स या नियंत्रकों के तहत रखूं। –

+0

क्या आपने इसे पंजीकृत करके प्लगइन को बूटस्ट्रैप भी किया था? – streetparade

+0

resource.frontController.pluginDirectory = APPLICATION_PATH "/ plugins" – streetparade

0

चूंकि एप्लिकेशन स्वत: लोडर को पंजीकृत करने के बाद कॉन्फ़िगरेशन फ़ाइल से बूटस्ट्रैप करेगा, इसलिए आपको पथ शामिल करने में AuthPlugin.php (जिसमें AuthPlugin क्लास होना चाहिए) डालना चाहिए।

+0

मैंने कोशिश की लेकिन मैं इसे काम नहीं कर सकता। मैंने बहुत अधिक जानकारी के साथ विवरण अद्यतन किया। शायद आप जो खोज रहे हैं उसे देख सकें। –

0

hmm zf 1.11 में एक ही समस्या है। ऐसा लगता है कि प्लगइन्स लोड होने से पहले ऑटोलोडर मौजूद नहीं है:

0

मुझे एहसास है कि यह एक पुराना सवाल है, लेकिन मैं लाइब्रेरी के बाहर प्लगइन को स्वत: लोड करने के समाधान के लिए उम्र के लिए चारों ओर खोज रहा हूं और अंततः यह अनुमान लगाया है यह बाहर। आम तौर पर, मैं कई अलग-अलग परियोजनाओं में उपयोग करने के लिए जेनेरिक प्लगइन्स लिख रहा हूं और उन्हें लाइब्रेरी में समझ में रखता हूं, जिससे आप मानक जेडएफ नामकरण सम्मेलनों का पालन करते हैं, फिर भी वे वैसे भी ऑटोलोड हो जाएंगे। हाल ही में, मैं एक परियोजना विशिष्ट प्लगइन लिख रहा था और मैं इसे अपनी एप्लिकेशन निर्देशिका में कहीं भी रखना चाहता था, लेकिन ऑटोलोड कैसे करें? मैंने कभी नहीं पाया है कि "एप्लिकेशन/प्लगइन्स" निर्देशिका का उपयोग करके काम किया। उम्मीद है कि इससे किसी और को फायदा हो सकता है:

यदि आप "एप्लिकेशन/प्लगइन्स" निर्देशिका का उपयोग करने के बजाय मॉड्यूलर निर्देशिका संरचना का उपयोग कर रहे हैं तो आप "एप्लिकेशन/मॉड्यूल_नाम/प्लगइन्स" का उपयोग कर सकते हैं। इसके बाद आप Module Resource Autoloader का लाभ उठा सकते हैं, जो ज़ेडएफ का व्यापक रूप से उपयोगी और अंतर्निहित हिस्सा है। यदि आप इसे अपने बूटस्ट्रैप में सेट अप करते हैं, तो डिफ़ॉल्ट रूप से यह फ़ॉर्म, मॉडल और (मैंने आज खोजा) प्लगइन सहित सामानों के पूरे समूह को स्वत: लोड करने के लिए सेट अप किया है। आप अपने स्वयं के कस्टम संसाधन प्रकार भी परिभाषित कर सकते हैं।

public function _initAutoLoader() { 
    $autoloader = Zend_Loader_Autoloader::getInstance(); 

    $defaultLoader = new Zend_Application_Module_Autoloader(
     array(
      'namespace' => '', 
      'basePath' => APPLICATION_PATH . '/modules/default' 
     ) 
    ); 

    $adminLoader = new Zend_Application_Module_Autoloader(
     array(
      'namespace' => 'Admin', 
      'basePath' => APPLICATION_PATH . '/modules/admin', 
     ) 
    ); 

    $adminLoader->addResourceTypes(
     array(
      'vo' => array(
       'path'  => 'models/vo', 
       'namespace' => 'Vo', 
      ) 
     ) 
    ); 

    $autoloader->pushAutoloader($defaultLoader); 
    $autoloader->pushAutoloader($adminLoader); 
} 

यहाँ मैं दो मॉड्यूल, डिफ़ॉल्ट और व्यवस्थापक: उदाहरण के लिए नीचे एक परियोजना है जो एक डिफ़ॉल्ट और व्यवस्थापक मॉड्यूल और एक कस्टम 'VO' संसाधन व्यवस्थापक मॉड्यूल में निहित प्रकार है में एक बूटस्ट्रैप से एक _initAutoloader समारोह है । निम्नलिखित निर्देशिका संरचना मान लिया जाये:

application/default/forms/FooForm.php 
application/default/models/FooModel.php 
application/default/plugins/FooPlugin.php 
application/admin/forms/FooForm.php 
application/admin/models/FooModel.php 
application/admin/models/vo/FooVo.php 
application/admin/plugins/FooPlugin.php 

मैं कर सकते हैं किसी भी मॉड्यूल भर में autoload बस प्रत्येक वर्ग की एक वस्तु instantiating द्वारा:

new Form_FooForm(); 
new Model_FooModel(); 
new Plugin_FooPlugin(); // or add plugin to application.ini 
new Admin_Form_FooForm(); 
new Admin_Model_FooModel(); 
new Admin_Vo_FooVo(); // custom resource type 
new Admin_Plugin_FooPlugin(); // or add plugin to application.ini 
संबंधित मुद्दे