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{}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top