2011-01-12 3 views
2

Vorausgesetzt, das Modell ist eine "domänenspezifische Darstellung der Daten, auf denen die Anwendung arbeitet." [Wikipedia: MVC], Dienst, Formular, Plugin-Klassen, usw. werden nicht als Teil des Modells betrachtet, daher gehen sie in ihre eigenen Verzeichnisse unter /application. Der Standard-Ressourcen-Auto-Loader stellt dies für uns ein, so dass MyApp_Form_Login automatisch in /application/form/Login.php gefunden wird.Wo ist der beste Ort, um anwendungsspezifische Nicht-Modell-Klassen in einer Zend Framework App zu speichern?

Für meine Anwendung muss ich einen benutzerdefinierten Authentifizierungsadapter schreiben. Die darin enthaltene Logik ist anwendungsspezifisch, daher handelt es sich nicht um wiederverwendbaren Bibliothekscode. Daher gehört sie nicht in /library/MyApp. Es ist keine Serviceklasse, also gehört es nicht in /application/service, noch ein Formular usw. Also, idiomatisch, wo sollte diese Klasse gespeichert werden?

Antwort

2

Sie können in Ihrem application Ordner weitere Ordner erstellen und eine Ressourcenpfad in Ihrer Bootstrap Klasse hinzuzufügen.

zum Beispiel davon aus, dass Sie einen Namespace für alle anwendungsspezifischen Klassen verwenden (Modelle, Formen, Plugins, usw.) von ‚Anwendung‘, könnten Sie Folgendes verwenden:

protected function _initAutoloader() 
{ 
    $autoloader = new Zend_Application_Module_Autoloader(array(
      'basePath' => APPLICATION_PATH, 
      'namespace' => 'Application', 
     )); 
    $autoloader->addResourceType('MyType', APPLICATION_PATH . '/mytypes'); 
    return $autoloader; 
} 

Dann könnten Sie habe eine Klasse namens Application_MyType_Foo in der Datei application/mytypes/Foo.php gespeichert.

Wenn Sie den Code für Zend_Application_Module_Autoloader aussehen, das ist im Wesentlichen, was sie tun, um Ihnen für die Modelle, Formen, Plugins selbstladende usw.

2

Erstellen Sie einfach eine anwendungsspezifische Bibliothek. Normalerweise ist eine solche Klasse nicht der einzige Kandidat für eine persönliche Bibliothek.

+0

Sicherlich ist es nicht in der Bibliothek gehören, weil sie nicht wiederverwendbar über verschiedene Anwendungen hinweg ist. Dies hängt von anwendungsspezifischen Konfigurationsoptionen ab, die in der Registrierung festgelegt und verfügbar sind (und daher davon abhängen, ob eine Registrierung verfügbar ist). Es scheint mir komisch, Zwei-Wege-Abhängigkeiten zwischen Anwendungscode und Bibliothekscode zu haben. –

+1

Das ist der Grund, ich nenne es "Application Library";) Seine Bibliothek, spezifisch für Ihre Anwendung. Sie werden später andere Klassen sehen, für die Sie kein geeignetes Modul oder Unterverzeichnis finden. Jedoch: Injizieren Sie die Optionen nach Instanziierung (oder vielleicht später) in Ihre Objekte, anstatt umgekehrt. Ihre Klassen sind auf diese Weise nicht testbar. Die Registrierung als "Datencontainer" ist sowieso schlecht. – KingCrunch

+0

Ja, Dependency-Injektion ist der Weg zu gehen, ich illustrierte nur ein Beispiel. Ich finde immer noch die Idee, eine Bibliothek für diese Art von Klasse seltsam zu erstellen. Was macht Plugins zum Beispiel so besonders, dass sie in '/ application' ein Verzeichnis bekommen, aber ein Auth-Adapter nicht? –

0

Ein Ansatz besteht darin, eine Serviceklasse zu erstellen (wir wissen, wo diese vorhanden sind: /application/service), die die anwendungsspezifische Authentifizierungslogik kapselt. Es kann eine Bibliotheksklasse verwenden, um grundlegende Auth, z. Überprüfen Sie den Benutzernamen und das Kennwort für eine Datenbank, wenden Sie dann jedoch anwendungsspezifische Logik an, bevor Sie das Ergebnis an den Client-Code senden.

Beispiel:

class MyApp_Service_User { 
    public function authenticate($sUsername, $sPassword) { 
    $oAuth = Zend_Auth::getInstance(); 
    $oAuthAdapter = new Zend_Auth_Adapter_DbTable(...); 
    $oResult = $oAuth->authenticate($oAuthAdapter); 

    /* Application-specific logic */ 

    return $oAppSpecificAuthResult; 
    } 
    ... 
} 
Verwandte Themen