11 Stimmen

Verwendung von Formularen mit dem Zend Framework

Ich bin relativ neu in MVC und dem Zend Framework. Das heißt, ich habe das Gefühl, dass es mir schwer fällt herauszufinden, wo Forms in meiner Verzeichnisstruktur hingehören. Ich habe eine modulare Verzeichnisstruktur, also weiß ich nicht, ob es ein einzelnes Formularverzeichnis oder eines innerhalb jedes Modulverzeichnisses geben sollte.

/application
    /modules/
        /default
            /controllers
            /views
        /admin
            /controllers
            /views

Wenn Sie sich für ein Verzeichnis für Formulare entschieden haben, setzen Sie dieses Verzeichnis in den Include-Pfad des Bootstrap? Oder binden Sie das Formular in den Controller ein, in dem es verwendet wird?

Wie werden Sie Formulare mit dem Zend Framework verwenden?

11voto

NDM Punkte 6565

Es ist ein bisschen spät, aber in der aktuellen Version von ZF wurde dieses Problem gelöst:

Auf der folgenden Seite http://framework.zend.com/manual/en/zend.loader.autoloader-resource.html Im Handbuch heißt es:

30.3.2. Der Modul Ressourcen Autoloader Zend Framework wird mit einer konkreten Implementierung von Zend_Loader_Autoloader_Resource ausgeliefert die Ressourcentyp Mappings enthält die die standardmäßig empfohlene Verzeichnisstruktur für Zend Framework MVC Anwendungen abdecken. Dieser Lader, Zend_Application_Module_Autoloader, kommt mit den folgenden Mappings:

api/         => Api
forms/       => Form
models/      => Model
    DbTable/ => Model_DbTable
plugins/     => Plugin

Als Beispiel, wenn man ein Modul mit dem Präfix "Blog_" hat, und versucht die Klasse "Blog_Form_Entry" zu instanzieren, würde es im Unterverzeichnis "forms/" des Ressourcenverzeichnisses nach einer Datei namens "Entry.php" suchen. Wenn Modul-Bootstraps mit Zend_Application verwendet werden, wird standardmäßig eine Instanz von Zend_Application_Module_Autoloader für jedes einzelne Modul erstellt, was es erlaubt, Modul-Ressourcen automatisch zu laden.

Dies erfordert jedoch die Verwendung von Zend_Application

0 Stimmen

Gut zu wissen! Ich habe die letzten Änderungen nicht verfolgt, daher ist es hilfreich zu wissen, dass dies in den aktuellen Versionen berücksichtigt wurde.

0 Stimmen

Genau das, wonach ich gesucht habe. Ich ging das Modell/Formulare Weg und derzeit Refactoring meine Struktur mit Zend Standards/Empfehlungen auszurichten.

4voto

abulbul Punkte 1174

Fügen Sie dies in die Datei application/modules/yourmodule/Bootstrap.php ein.

class Yourmodule_Bootstrap extends Zend_Application_Module_Bootstrap
{

protected function _initAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'Yourmodule_',
            'basePath'  => APPLICATION_PATH .'/modules/yourmodule',
            'resourceTypes' => array (
                'form' => array(
                    'path' => 'forms',
                    'namespace' => 'Form',
                ),
                'model' => array(
                    'path' => 'models',
                    'namespace' => 'Model',
                ),
            )
        ));
        return $autoloader;
    }

}

2voto

Matt Gardner Punkte 1008

Im März '09 scheinen die Vordenker von ZF immer noch darüber zu debattieren, wie man alles am besten organisiert. Es gibt eine Gerüst-Generator als Teil von Zend_Tool die in ZF v1.8 veröffentlicht werden soll. Es ist derzeit im Inkubator, ich habe es letzte Woche ausprobiert und es funktioniert, aber es gibt nicht viele Komponenten in seinem aktuellen Zustand erzeugt.

Von den Beispielen, die ich gesehen habe, scheint es, dass sie am besten getrennt von den Modellen, mit denen sie interagieren, verwaltet werden (dies ist von Zend Framework In Action):

/application
    /modules/
        /default
            /controllers
            /forms
                ContactForm.php
                LoginForm.php
                RegisterForm.php
                SupportForm.php
            /models
                Comment.php
                User.php
                Users.php
            /views
        /admin
            /controllers
            /views

Ich habe aber auch schon gesehen, dass die Formulare unterhalb des Modellverzeichnisses strukturiert sind. Matthew Weier O'Phinney zeigt, wie man sie für die Validierung von Modellen zu verwenden selbst:

/application
    /modules/
        /default
            /controllers
            /models
                Comment.php
                User.php
                /Form
                    Comment.php
                    Login.php
                    Register.php
            /views
        /admin
            /controllers
            /views

Damit Ihre Dateien automatisch einbezogen werden, müssen Sie Ihre Klassen mit einem Unterstrich benennen.

Zum Beispiel, wenn Zend_Loader sieht

 class RegisterController extends Zend_Controller_Action

Es sucht im php include_path nach:

Zend/Controller/Action.php

Ähnlich verhält es sich mit der ersten Struktur oben, wenn wir das Modul "default" in unseren include_path aufnehmen:

# bootstrap.php
$rootDir = dirname(dirname(__FILE__));
define('ROOT_DIR', $rootDir);
set_include_path(get_include_path()
    . PATH_SEPARATOR . ROOT_DIR . '/library/'
    . PATH_SEPARATOR . ROOT_DIR . '/application/modules/default/'
);
include 'Zend/Loader.php';
Zend_Loader::registerAutoload();

Sie benennen Ihre Klassen:

Forms_ContactForm
Models_User

Einige Programmierer legen die meisten ihrer Dateien in der Bibliothek ab, um keine zusätzlichen Include-Pfade hinzufügen zu müssen:

/library
    /My
        /Form
            Contact.php

Unter der Annahme, dass der Bibliotheksordner enthalten ist, würde die obige Klasse so benannt werden:

My_Form_Contact

Viel Glück! -Matt

0 Stimmen

Ich habe in der obigen Antwort einige zusätzliche Anmerkungen hinzugefügt. Lassen Sie mich wissen, wenn Sie Fragen haben.

0 Stimmen

Das Problem bei dieser Methode ist, dass Sie jedes Modulverzeichnis zum include_path hinzufügen müssen. Und auch Forms_ContactForm scheint überflüssig und hässlich.

0 Stimmen

Ich stimme völlig zu, diese spezielle Ordnerstruktur wurde mit Include-Anweisungen verwendet (nicht für Zend Loader gedacht). Und in jedem Fall ist Ihr Vorschlag in der Tat viel eleganter :)

1voto

leek Punkte 11253

Ich persönlich fand es am einfachsten, mein Modulverzeichnis in den Include-Pfad zu legen und meine Formularklassen nach dem Zend Loader Muster zu benennen.

Beispiel einer Verzeichnisstruktur (Kopieren von Matt 's Antwort):

/application
    /modules/
        /default
            /controllers
            /forms
                Contact.php
                Login.php
                Register.php
                Support.php
            /models
                Comment.php
                User.php
                Users.php
            /views
        /admin
            /controllers
            /views

Beispiel für die Namen von Formularklassen:

Default_Forms_Contact
Default_Forms_Login
Default_Forms_Register
Default_Forms_Support

Ich benenne meine Modelle und Plugins ähnlich, um die Dinge einfach zu halten.

Ich hoffe, dass dieses Problem in späteren Versionen des Zend Frameworks korrekt behandelt wird.

UPDATE: Diese Struktur funktioniert nicht auf *nix-Plattformen. Das habe ich auf die harte Tour herausgefunden! Der Zend Loader benötigt die Modul-, Formular- und Modellordner in Großbuchstaben, um in einer Umgebung mit Groß- und Kleinschreibung zu funktionieren.

0 Stimmen

Nur zur Info: Ich finde '{Modul}_Forms_{Name}' auch hässlich.

1voto

Gabriel Solomon Punkte 28207

Ich persönlich möchte sie in meinem Anwendungsordner aufbewahren, da sie meiner Meinung nach nicht in die Bibliothek gehören und ein einziger Ordner das automatische Laden der Dateien erleichtert.

/application
/forms
/modules/
    /default
        /controllers
        /views
    /admin
        /controllers
        /views
/libray/
    /Zend

und ich habe einfach den Formularpfad zum includes_path hinzugefügt und schon kann es losgehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X