Brauch mal nen Schubser ...

  • In meinem Framework (irgendwie gefällt mir der Name nicht mehr) hab ich folgenden Aufbau:


    Alles läuft über Module. Und ganz am Anfang werden über einen Loader sämtliche Module geladen.
    Dabei geht der Loader wie folgt vor:
    - geh in den Order modules/default/
    - für jeden Ordner : include Datei (was die class darstellt) welche genauso heißt wie der Ordner
    - wenn class *name* eine Methode onload() besitzt : ausführen
    - include alle zusätzlichen Dateien aus diesem Ordner


    Heißt also, dass alle Module in einem eigenen Order liegen, so wie alle zugehörigen Dateien.
    Die Datei, die genauso wie der Ordner heißt, ist die "Hauptklasse".
    Zusätzliche Dateien sind auch meist Klassen wie zB UserController ect.


    Bsp:
    User - ist die "Hauptklasse"
    UserControllerMain - steuert den Grundablauf des Users (login ect)
    UserControllerForgotPassword - steuert speziell den Ablauf der Forgot-Password-Function


    Das Problem:

    PHP
    class UserControllerForgotPassword  extends UserControllerMain  {...}


    ^damit will PHP via autoload die Klasse UserControllerMain laden was ja richtig ist,
    aber meine func in der autoload ist nicht dafür ausgelegt:

    PHP
    spl_autoload_register(
                function($class){
                    (include_once PATH_INC_MODULES_DEFAULT.$class.'/'.$class.'.php')
                    or
                    (include_once PATH_INC_MODULES_OTHERS.$class.'/'.$class.'.php');
                }
            );


    Zitat

    Warning: include_once(includes/modules/default/UserControllerMain/UserControllerMain.php): failed to open stream: No such file or directory in C:\xampp\htdocs...


    Die eigtliche Datei liegt in:

    Zitat

    includes/modules/default/User/UserControllerMain.php


    class User wird also als erstes geladen.
    class UserControllerForgotPassword VOR UserControllerMain, wegen der Sortierung (UserControllerF* vor UserControllerM*)
    Jetzt könnte ich die UserControllerMain in UserController_Main umbenennen, aber das ist dämlich :D


    Und ich dachte eigtl, dass ich wiedermal beim schreiben dieses Posts schon selbst drauf komme,
    aber ... nö -.-
    brauch also mal nen Schubser =)

  • *schubs* in Richtung Laravel, Code Igniter, Symfony, ...
    Ich wuerde sagen, es gibt schon einige Frameworks, die das erfolgreich umgesetzt haben, da koennte man sich angucken, wie das da gemacht wurde...


    Das hier zB koennte evtl weiterhelfen: Code Igniter Loader.php

  • Ja, die nutzen nix dynamisches.
    In Codelgnitter steht:

    PHP
    // ...
    public function initialize()
    	{
    		$this->_ci_autoloader();
    	}
    // ...


    und in der func _ci_autoloader():


    Also wird da irgendwo in der config ein array mit filenames geladen.
    Genauso wie bei Yii:

    PHP
    private static $_coreClasses=array(
    		'CApplication' => '/base/CApplication.php',
    		'CApplicationComponent' => '/base/CApplicationComponent.php',
    		'CBehavior' => '/base/CBehavior.php',
    		'CComponent' => '/base/CComponent.php',
    		'CErrorEvent' => '/base/CErrorEvent.php',
    		'CErrorHandler' => '/base/CErrorHandler.php',
    // ...


    =(
    ABER
    ich hab gerade bei Yii im autoloader was gesehen: die nutzen die Namespaces als Pfad, wenn die Klasse nicht in der config existiert.
    Heißt, dass die Klasse selbst den Pfad im Namen hat.
    Und das ärgert mich jetzt, weil ich weiß, dass das ne Lösung ist, aber ich mich um Namespaces drücken wollte :D
    damn!

  • Loesung: http://stackoverflow.com/quest…ultiple-diectories-in-php
    PSR-0: http://petermoulding.com/php/psr#psr-0


    Jetzt versteh ich auch was ich da in den anderen Frameworks gelesen hab. Die nutzen diese oder eine aehnliche Methode =)
    (Voraussetzung: Verstaendnis/Nutzung von namespace (siehe php.net))


    EDIT: was mir aber daran nicht gefaellt ist, dass man überall den namespace direkt angeben muss.
    Ich kann also nicht in der config.php den Pfad INC definieren und
    namespace INC;
    nutzen.


    Daher muss bei jeder Pfadaenderung der namespace in den Files geaendert werden -.-



    EDIT2: weg mit namespace und her mit der neuen Idee :D
    Wie gesagt - mit der psr-0 methode(?) muss man namespace nutzen. Und namespace kann sinnvoll sein, kann aber auch nerven.
    Und ich fang definitiv nicht an in jedes File den namespace manuell zu setzen. Dynamisch scheint namespace (das Setzen des namespace ...;) ja nicht nutzbar.


    Da ja mein Loader sowieso so aufgebaut war, dass er sich bestimmte Verzeichnisse krallt, war die Aenderung recht einfach.
    Was mach der Loader?
    - lade alle Dateien von Verzeichnis X
    - registriere alle Dateien von Verzeichnis Y


    Bei den Klassen wird also nichts geladen, sondern gemerkt wo was liegt.
    Wenn dann mal ne Klasse ueber autoload gesucht wird, wird in der Liste gesucht.


    Darauf gekommen bin ich, weil die variante mit namespace aehnlich funktioniert - nur halt mit den Pfadangaben im namespace ...
    Nur gefaellt mir meine Variante besser, denn ich brauche keine Pfade manuell platzieren, der Hauptpfad ist einmal in der config.php hinterlegt,
    und ueber die Loader::_load() kann ich die (wenn man es so nennen will) "Pfad-whitelist" jederzeit anpassen =)


    Hier mal der code:

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!