2010-06-25 11 views
6

Diciamo che ho il seguente nel mio file ini:Quale directory viene usata per i plugin di Zend?

resources.frontController.plugins.auth = AuthPlugin 

Dove dovrebbe la classe AuthPlugin essere posizionati? Diciamo che mi piacerebbe sotto controller/plugin.

UPDATE:

Sulla base dei suggerimenti qui sotto sto ancora avendo difficoltà. Mi permetta di essere precisi in ciò che ho attualmente:

1) parte principale del 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) la mia bootstrap.php non ha nulla (ho avuto un sacco di cose in là, ma ancora ottenere il errore con niente):

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
} 

3) ho una classe AuthPlugin.php in applicazione/plugins directory

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

Viene visualizzato il seguente errore:

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

Suppongo che mi manchi qualcosa di ovvio qui. Grazie in anticipo. Zend Framework 1.10

risposta

3

Questo è come posso registrare un plugin chiamato Foo_Plugin_SuperDuperPlugin nella mia applicazione di configurazione:

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

Il plugin si trova a
APPLICATION_PATH/plugins/Foo_Plugin_SuperDuperPlugin.php ed è caricata automaticamente da lì perché il Resource Module Autoloader sembra automaticamente in quella (consigliato) posizione per risorse di tipo plugin. Se volessi caricare il plug-in, ad esempio,
APPLICATION_PATH/controllers/plugins/Foo_Plugin_SuperDuperPlugin.php, registrerei un nuovo caricatore di risorse con il caricatore automatico e definirò un tipo di risorsa denominato "plug-in" e il percorso di tali risorse del plug-in. Così nel mio 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', 
       ) 
      ) 
     ) 
    ); 
} 

e poi ho bisogno di garantire che questo metodo viene bootstrap prima che il SuperDuperPlugin è registrato (che, in questo esempio, si verifica quando la configurazione dell'applicazione viene letto resources.frontcontroller.plugins.superduperplugin.class = ...). Questo può essere ottenuto posizionando il metodo _initAutoloader nella parte superiore del bootstrap.php o chiamando $this->bootstrap('autoLoader'); da qualsiasi altro metodo _init, prima che la risorsa frontController sia inizializzata.

aggiornamento: Prova ad aggiungere questo alla tua bootstrap:

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

e forse anche lasciare fuori lo spazio dei nomi. Oppure: aggiungere appnamespace = "Foo" alla configurazione e rinominare la classe su Foo_Plugin_AuthPlugin.

+0

Allora devo fare qualcosa di sbagliato, perché non riesco a farlo funzionare. Sto aggiornando la domanda originale con maggiori dettagli. –

+0

Ho aggiornato la mia risposta. – jah

+0

Potrei farlo funzionare con l'aggiunta di risorse, ma alla fine l'ho fatto funzionare con un basic require 'controller/AuthPlugin.php'; (o qualsiasi altra directory lo metti) nel metodo _initAutoloader(). –

0

penso a/applicazione/plugins/

Ma si potrebbe anche impostare un altro Directory per esso.

+0

Grazie, ma che non sembrano funzionare. Può darsi che il mio autoloading non funzioni correttamente per questo tipo di classe, ma non riesce a trovare la mia classe AuthPlugin se la metto sotto application/plugins o controller. –

+0

hai anche fatto il bootstrap del plugin registrandolo? – streetparade

+0

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

0

Poiché l'applicazione si avvierà automaticamente dal file di configurazione dopo aver registrato il caricatore automatico, è necessario inserire AuthPlugin.php (che deve contenere la classe AuthPlugin) nel percorso di inclusione.

+0

Ho provato questo, ma non riesco a farlo funzionare. Ho aggiornato la descrizione con molte più informazioni. Forse riesci a individuare quello che mi manca. –

0

hmm sto avendo lo stesso identico problema in zf 1.11. Sembra che il caricatore automatico non esista prima che i plugin vengano caricati: s

0

Mi rendo conto che questa è una domanda vecchia, ma ho cercato da un po 'di tempo una soluzione per il caricamento automatico dei plugin al di fuori della libreria e finalmente ho capito fuori. In generale, ho scritto plug-in generici da utilizzare in molti progetti diversi e averli mantenuti nella libreria aveva senso, a patto che seguissi le convenzioni standard di denominazione ZF che verranno comunque caricate automaticamente. Recentemente, stavo scrivendo un plugin specifico per il progetto e volevo tenerlo da qualche parte all'interno della mia directory applicativa, ma come eseguire il caricamento automatico? Non ho mai trovato che l'uso della directory "application/plugins" funzionasse. Speriamo che questo possa giovare a qualcun altro:

Se si utilizza una struttura di directory modulare, anziché utilizzare la directory "application/plugins" è possibile utilizzare "application/module_name/plugins". È quindi possibile sfruttare il Module Resource Autoloader, che è una parte di ZF estremamente utile e sottoutilizzata. Se lo imposti nel tuo bootstrap, per impostazione predefinita è impostato per caricare automaticamente un sacco di cose, inclusi moduli, modelli e plugin (ho scoperto oggi). Puoi anche definire i tuoi tipi di risorsa personalizzati. Per esempio qui sotto è una funzione _initAutoloader da un bootstrap in un progetto che ha un modulo predefinito e admin e un tipo di risorsa 'vo' su misura contenuta nel modulo di amministrazione:

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); 
} 

Qui ho due moduli, di default e admin . Supponendo che la seguente struttura di directory:

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 

posso caricare automaticamente attraverso qualsiasi modulo appena istanziando un oggetto di ogni classe:

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 
Problemi correlati