Alle Zend Module manuell in der „Bootstrap.php“ zu initialisieren kann auf Dauer anstregend sein. Aus diesem Grund wurde der Zend_Application_Module_Autoloader erfunden. Damit können nach einem festen Standard die einzelnen Module dynamisch geladen werden.
Wie das geht zeige ich an einem Beispiel aus „/application/models„.
Quellcode:
/application/Bootstrap.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initAutoloader() { $moduleLoader = new Zend_Application_Module_Autoloader ( array ( 'namespace' => '', 'basePath' => APPLICATION_PATH ) ); } |
Durch diese Deklaration sucht der Zend Autoloader automatisch im Ordner „/models“ nach Modellen, im Ordner „/forms“ nach Formularen und im Ordner „/acl“ nach Zugriffskontrolllisten. Dazu müssen die jeweiligen Klassen aber einer bestimmten Benennung folgen und auch so eingesetzt werden. Ein Model für einen „User“ muss demnach wie folgt abgespeichert und definiert werden:
/application/models/User.php
1 2 3 4 | <?php class Model_User { ... |
Laut der Autoloader-Referenz haben Model-Klassen eine Besonderheit, und zwar darf bei ihrem Dateinamen nicht das Prefix „Model_“ gesetzt werden, obwohl es im Klassennamen erforderlich ist. Bei Formularen und Zugriffskontrolllisten muss ein Prefix gesetzt werden.
Um das „User“-Modul in einem Controller zu verwenden, muss es über seinen Klassennamen erzeugt werden.
/application/controllers/UserController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php class UserController extends Zend_Controller_Action { public function init() { /* Initialize action controller here */ } public function indexAction() { $db = new Model_User(); } } |
So wie ich das verstehe, ist das einzige, dass man hier gewinnt, dass man statt
$db = new Application_Model_User();
(so wie die Klasse User in /application/models/User.php normalerweise angesprochen werden müsste)
nur noch
$db = new Model_User();
schreiben muss. Oder hab ich das was falsch verstanden?
Wie muss ich den Autoloader denn konfigurieren, damit er auch auch Klassen aus eigenen Modulen (also NICHT „application“ – das ist ja quasi das Standardmodul) auto-lädt?
Zum Beispiel eine Klasse ‚Beispiel‘ aus dem Modul ‚Mein‘:
Pfad: /application/modules/mein/models/Beispiel.php
Klassenname: Mein_Model_Beispiel