Verwenden Sie Zend Autoloader für Models
-
12-09-2019 - |
Frage
hat jemand weiß, wie den „neuen“ Zend Autoloader verwenden Modelle zu laden? Im Moment meine Konfiguration sieht wie folgt aus:
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;
}
Wenn ich also legen Sie ein Modell in /Models/User.php mit
class Sl_Model_User{}
und erstellen Sie ein neues Objekt, funktioniert alles wie entworfen. Aber wie kann ich den Autoloader ein Modell in /Models/Dao/UserDB.php platziert laden?
class Dao_UserDB{}
Lösung
Überprüfen Sie die Dokumentation auf der Resource_Autoloader (dessen Zweck es ist, Ressourcen zu laden, die in den Modellen Verzeichnis befinden oder anderswo - das heißt außerhalb des / Library-Ordner).
"Ressource Autoloader sollen Namespace-Bibliothek Code verwalten, die Zend Framework Coding Standard Richtlinien folgen, die aber nicht über eine 1:. 1-Zuordnung zwischen dem Klassennamen und der Verzeichnisstruktur Ihres primärer Zweck ist die automatische Laden von Anwendungsressourcen Code zu erleichtern , wie anwendungsspezifische Modelle, Formen und ACLs.
Ressource Autoloader registrieren mit dem Autoloader auf Instanziierung mit dem Namespace, dem sie zugeordnet sind. Auf diese Weise können Sie ganz einfach Code in bestimmten Verzeichnissen Namensraum, und immer noch die Vorteile von autoloading ernten. "
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/',
),
));
Versuchen Sie dies in Ihrer Bootstrap-Datei:
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'
)
));
}
Andere Tipps
auf Ihrem aktuellen Setup Je
Klassendatei: /Models/Dao/UserDB.php
Klassenname: Klasse Dao_UserDB {}
sollte:
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Dao_',
'basePath' => APPLICATION_ROOT.'/Models/Dao/',
));
Aber man könnte auch der Name der Klasse: S1_Dao_UserDB () soll dies ohne Änderung arbeiten.
Um Autoloader Regeln für kundenspezifische Modelle (in benutzerdefinierter Bibliothek dir) wie definiert werden:
|-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
Sie sollten fügen Sie diese in Ihrem 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')
),
);
}
dauerte eine Weile, um es herauszufinden, hofft, dass es jemandes Zeit spart.