Portal > Foren > PHP > PHP-Programmierung > Einbindungsmöglichkeiten von Modulen in ein Framework
Antwort
 
Themen-Optionen
Alt 07.06.2006, 23:36 Nach oben    #1
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard Einbindungsmöglichkeiten von Modulen in ein Framework

Aloah.
Stellen wir uns mal vor, jeder von euch hat ein eigenes Framework gebastelt und möchte nun Module dazu entwickeln. Wir würdet ihr die Einbindung realisieren? Denn ein Modul ist ja nur optional...

Ich würde erstmal dem Framework ne index.php und jedem Modul nen eigenen Ordner mit eigener Struktur und eigener index.php verpassen.
Nun gehts um das dynamische einbinden von Klassen via __autoload(). Soll ich die __autoload() des Frameworks von beginn an so programmieren, dass er nach Modulen sucht und auch dort schaut, ob es die Klassen gibt? Oder wäre es besser, jedem Modul eine eigene __autoload() zu verpassen, die auch auf das Framework zugreifen kann?

Eine andere Idee wäre vielleicht eine registry.php in der alle Module und deren Klassen hinterlegt sind und die __autoload() arbeitet diese dann durch. Wäre so ne Art Index auf Dateiebene. Problem wäre die aktualisierbarkeit und die verlorengegangene Dynamik die ich mit __autoload() ja waren wollte. Also eher bäh die Idee.

Wir habt ihr das gemacht? Wie würdet ihr das machen?

Danke
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.06.2006, 23:40 Nach oben    #2
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Wie sehen die Module denn aus?
Sind diese Module nur einzelne Dateien, oder manchmal wirklich ganze, quasi kleinere Frameworks? Wenn das nur einzelne Dateien sind, würd ich einfach einen neuen Ordner anlegen, diesen mit glob() auslesen (wobei ich irgendwo mal gelesen hab, dass die opendir()-Variante sogar etwas schneller sein soll?). In dem Fall müsstest du ja nicht so viel suchen, ein Ordner durchsuchen geht mit PHP wohl ziemlich rasch. So könntest du die einzelnen Module nachladen, und zwar dynamisch.

Die andere Ar, über eine registry.php wär zwar auch denkbar, ist meiner Meinung nach aber dann ja nicht mehr so dynamisch - dann könntest du die auch gleich per *_once einbinden.

Ich persönlich habe das wie in oben beschrieben gelöst (1 Ordner)
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.06.2006, 00:45 Nach oben    #3
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Hm, das ist so eine Frage, über die ich mir schon 34mal beim Spazierengehen am Rhein Gedanken gemacht habe.

Generell würde ich sagen, dass es die Möglichkeit geben sollte Module online "hinzuzufügen".
Heißt also, dass man ein Modul zunächst einmal in den Ordner "modules"/"plugins"/was auch immer kopiert.
Code:
./modules
 |- ./my_module
 |- ..
Jut. Dann würde ich in einer Datenbanktabelle abspeichern, welche Module gerade aktiv sind und welche deaktiviert.
So kann man vermeiden, dass Leute einen Blog nutzen, auch wenn kein Link zum Blog auf der Seite existiert, sondern die Leute über einen Bookmark da hingelangt sind.

Jut.
Bisher gut um die eigentliche Frage gedrückt.
Eventuell sollte man von Beginn an standardmäßig den include_path um den Pfad zum "modules"-Ordner erweitern.

Eine Klasse, die nun z.B. einen Blog darstellt läge also z.B. hier
Code:
./modules/Blog/Modul.php
Die Klasse würde dann Blog_Modul heißen. Nagelt mich nicht auf Namen fest! Ist halt nur ein möglicher Weg.

Gut. Wenn man davon ausgeht, dass man im System eine zentrale Stelle hat, in der alle Pfäden zusammenlaufen, so müsste ja dort irgendwie jetzt eine Änderungen vorgenommen werden.
Vielleicht nicht korrekt ausgedrückt ... es müsste dort nun irgendwie dynamisch festgelegt werden, dass, wenn ein bestimmter Link angeklickt, also ein spezieller URL aufgerufen wird, ein Modul gestartet werden soll.

Wie das geht ... joaaa ... .
So ganz weiß ich das auch nicht.

Möglich wäre z.B. die Arbeit mit einem include_once(). Man legt also im ACP fest, bei welcher URL das Modul aufgerufen werden soll (ich gehe jetzt mal davon aus, dass das ACP das dynamisch kann. Ist das nicht der Fall, so wird halt einfach ein fixer URL vorgegeben!).

Sagen wir also, dass der Blog aufgerufen werden soll, wenn www.example.com/blog/ in der Adresszeile steht.

In der "Zentrale" wird nun überprüft, ob der URL einem URL entspricht, der in der Datenbank hinterlegt wurde. Ist das der Fall, wird die damit verknüpfte Aktion ausgeführt: in unserem Fall also ein Modulaufruf.

Nun wollen wir aber ja sicherstellen, dass in der "Zentrale" kein Code geändert werden muss ... somit erweitern wir ihn einfach mit einfachsten Mitteln.
Setzt man regeln voraus, an die man sich halten muss, wenn man Module schreibt, so ist das sicherlich eine wirksame und einfache Möglichkeit eine Anwendung zu erweitern.

Wir binden einfach eine "blog_actions.php" mittels include_once() in einer Methode des "Controllers" (so nenn ich das jetzt mal) ein und erweitern somit den dort vorhandenen Code. Es ist somit sogar möglich auf Klassenvariablen, z.B. ein Konfigurations- oder Datenbankverbindungsobjekt zuzugreifen!

Das sehe ich persönlich an dieser Methode als sehr positiv an.
Selbstverständlich muss jedes Plugin bzw. die einzubindende Datei so implementiert sein, dass keine Fehler auftreten.
Dazu müssen dann eben strikte Regeln existieren.

Wie gesagt .. ich habe da schon lange drüber nachgedacht und noch nicht wirklich die perfekte Lösung gefunden, obwohl ich die hier schon ganz nett finde ..

Ich hör mir aber auch gerne andere Möglichkeiten an.
Bei Fragen zu meiner Methode .. immer her damit.

Grüße, Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.06.2006, 11:38 Nach oben    #4
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

Also die größe der Module muss definitiv nach oben offen sein. Es sind also nicht nur ein oder zwei Dateien sondern es können eigene Klassenstrukturen mit eigenen Templates und und und werden.

Ich glaube es macht Sinn, wenn ich einem Modul eine eigene index.php verpasse und dort das Framework einbinde und damit arbeite.
Problematisch wirds dann sicherlich wenn ein Modul auch ein anderes Benutzen könnte (optional) bzw braucht. Z.b. ein Adressverwaltung welches auch Geburtstage im Kalendermodul erzeugen kann, wenn Kalendermodul existiert und freigegeben ist.

Die Lösung mit der Datenbank wäre in meinen augen ja die gleiche Lösung wie die registry.php. Vorteil bei der registry wäre, dass ich nicht erst eine DB-Verbindung/DB-Klasse einbinden muss um zu wissen was ich hab und kann...

Horde hat das so gelöst:
PHP-Code:
<?php
/**
 * registry.php -- Horde application registry.
 *
 * $Horde: horde/config/registry.php.dist,v 1.255.2.14 2006/03/13 18:13:04 jan Exp $
 *
 * This configuration file is used by Horde to determine which Horde
 * applications are installed and where, as well as how they interact.
 *
 * Application registry
 * --------------------
 * The following settings register installed Horde applications.
 * By default, Horde assumes that the application directories live
 * inside the horde directory.
 *
 * Attribute     Type     Description
 * ---------     ----     -----------
 * fileroot      string   The base filesystem path for the module's files.
 * webroot       string   The base URI for the module.
 * jsuri         string   The base URI for static javascript files.
 * jsfs          string   The base filesystem path for static javascript files.
 * themesuri     string   The base URI for the themes. This can be used to
 *                        serve all icons and style sheets from a separate
 *                        server.
 * themesfs      string   The base file system directory for the themes.
 * icon          string   The URI for an icon to show in menus for the module.
 *                        Setting this will override the default theme-based
 *                        logic in the code.
 * name          string   The name used in menus and descriptions for a module
 * status        string   'inactive', 'hidden', 'notoolbar', 'heading',
 *                        'block', 'admin', or 'active'.
 * provides      string   Service types the module provides.
 * initial_page  string   The initial (default) page (filename) for the module.
 * templates     string   The filesystem path to the templates directory.
 * menu_parent   string   The name of the 'heading' group that this app should
 *                        show up under.
 * target        string   The (optional) target frame for the link.
 * url           string   The (optional) URL of 'heading' entries.
 */

// We try to automatically determine the proper webroot for Horde
// here. This still assumes that applications live under horde/. If
// this results in incorrect results for you, simply change the two
// uses of the $webroot variable in the 'horde' stanza below.
//
// Note for Windows users: the below assumes that your PHP_SELF
// variable uses forward slashes. If it does not, you'll have to tweak
// this.
if (isset($_SERVER['PHP_SELF'])) {
    
$webroot preg_split(';/;'$_SERVER['PHP_SELF'], 2PREG_SPLIT_NO_EMPTY);
    
$webroot strstr(dirname(__FILE__), '/' array_shift($webroot));
    if (
$webroot !== false) {
        
$webroot preg_replace(';/config$;'''$webroot);
    } elseif (
$webroot === false) {
        
$webroot '';
    } else {
        
$webroot '/horde';
    }
} else {
    
$webroot '/horde';
}

$this->applications['horde'] = array(
    
'fileroot' => dirname(__FILE__) . '/..',
    
'webroot' => $webroot,
    
'initial_page' => 'login.php',
    
'name' => _("Horde"),
    
'status' => 'active',
    
'templates' => dirname(__FILE__) . '/../templates',
    
'provides' => 'horde'
);
?>
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.06.2006, 17:10 Nach oben    #5
Jay
Gast
 
Beiträge: n/a
Standard

Ich hab mir das ganze auch mal überlegt und ich bin zu folgender Lösung gekommen:

Im Framework bestehen die Klassen nur aus Buchstaben zB MySuperClass
Die Module werden aber Module_Asdf benannt.

Folglich verwende ich für das Framework autoload Arrays und bei den Modulen wird einfach _ durch / ersetzt.

Damit habe ich sinnvolle Namen im Framework zB anstatt Filter_Input InputFilter und bei den Modulen habe ich Module_Name_IncludeClass.

Damit kann ich auch online einfach Module hinzufügen.

Außerdem hat jedes Modul ein XML File wo eine individuelle Konfiguration gemacht werden kann und das Modul näher beschrieben wird.

Die Liste der Module wird automatisch erzeugt. Ich lese einfach alle XML Files aus und führe den Titel, die Version, den Autor und die Beschreibung zu einem File zusammen (als Cache sozusagen).

Objekte werden automatisch gecached.

-- Jay
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP-Application Framework mepeisen Projekte unserer Mitglieder 26 12.07.2007 15:12
Zend Framework 0.8 veröffentlicht Ben Nachrichten 1 26.02.2007 13:59
Zend Framework 0.7.0 preview veröffentlicht Ben Nachrichten 0 19.01.2007 12:10
Wir unterstützen das inoffizielle deutsche Forum zum Zend Framework Ben Ankündigungen 0 28.12.2006 15:51
Suche Web Entwickler für ein Open Source Framework xardias Gesuche 3 03.03.2006 00:10


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:20 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44