Utilizzare Zend Autoloader per i modelli
-
12-09-2019 - |
Domanda
Qualcuno sa come utilizzare il "nuovo" Zend Autoloader per caricare modelle? In the Moment mia configurazione è simile al seguente:
Application.ini
# Autoloader Namespace
autoloadernamespaces.0 = "Sl_"
bootstrap.php
/**
* Start Autoloader
*
* @access protected
* @return Zend_Application_Module_Autoloader
*/
protected function _initAutoload()
{
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Sl_',
'basePath' => dirname(__FILE__),
));
return $autoloader;
}
Così, quando ho posto una modella in /Models/User.php con
class Sl_Model_User{}
e creare un oggetto nuovo, tutto funziona come progettato. Ma come posso utilizzare il caricatore automatico per caricare un modello posto in /Models/Dao/UserDB.php?
class Dao_UserDB{}
Soluzione
Controllare la documentazione sul Resource_Autoloader (il suo scopo è quello di caricare le risorse che si trovano nella directory di modelli o altrove - cioè al di fuori della cartella / Libreria).
"autoloader risorse sono destinate a gestire il codice della libreria namespace che seguono Zend Framework linee guida di codifica standard, ma che non hanno un 1:. Mappatura 1 tra il nome della classe e la struttura delle directory Il loro scopo primario è quello di facilitare il codice risorsa applicazione caricamento automatico , come i modelli specifici per l'applicazione, moduli e ACL.
autoloader risorse registrano con il caricatore automatico su di un'istanza, con lo spazio dei nomi a cui sono associati. Ciò consente di spazio dei nomi facilmente il codice in directory specifiche, e ancora raccogliere i frutti di caricamento automatico ".
path/to/some/directory/
acls/
Site.php
forms/
Login.php
models/
User.php
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => 'path/to/some/directory',
'namespace' => 'My',
));
$resourceLoader->addResourceTypes(array(
'acl' => array(
'path' => 'acls/',
'namespace' => 'Acl',
),
'form' => array(
'path' => 'forms/',
'namespace' => 'Form',
),
'model' => array(
'path' => 'models/',
),
));
Prova questo nel file di bootstrap:
protected function _initLoaderResource()
{
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => 'your_doc_root' . '/application',
'namespace' => 'MyNamespace'
));
$resourceLoader->addResourceTypes(array(
'model' => array(
'namespace' => 'Model',
'path' => 'models'
)
));
}
Altri suggerimenti
A seconda della configurazione corrente
classfile: /Models/Dao/UserDB.php
ClassName: class Dao_UserDB {}
dovrebbe essere:
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Dao_',
'basePath' => APPLICATION_ROOT.'/Models/Dao/',
));
Ma si potrebbe anche assegnare un nome alla Classe: S1_Dao_UserDB () questo dovrebbe funzionare senza cambiare.
Per definire le regole del caricatore automatico per i modelli personalizzati (in libreria dir personalizzato) come:
|-application
|-library
|-Foo
|-Models
|-Bar.php (holds Foo_Model_Bar class - mind no 's' in class name)
|-Forms
|-Bar.php (holds Foo_Form_Bar class - mind no 's' in class name)
|-Zend
|-public
|-test
Si dovrebbe aggiungere questo nel tuo bootstrap.php
/**
* Enable loading custom classes
*/
public function _initAutoloaders()
{
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => APPLICATION_PATH . '/../library/Foo',
'namespace' => 'Foo_'
));
$resourceLoader->addResourceTypes(array(
'foomodels' => array(
'namespace' => 'Model_',
'path' => 'Models')
),
'fooforms' => array(
'namespace' => 'Form_',
'path' => 'Forms')
),
);
}
Mi ci volle un po 'per capirlo, spero che qualcuno di risparmiare tempo.