sebastian: MVC Prinzip

Hi,

ich bin dabei, mir jetzt ein universelles kleines Framewerk in PHP zu schreiben, um meine Projekte schneller zu realisieren.

Das ganze soll auf dem MVC Prinzip aufgebaut sein.

Wie das funktioniert, ist mir eigentlich klar, nur frage ich mich zurzeit, wo den dann so Funktionen wie __autoload hinkommen. Außerdem solche Sachen wie eine Funktion von mir, die alle Konfigurationsdateien lädt, die gehört ja auch nicht in den Controller, wo kommen solche Funktionen hin, wo werden Sie aufgerufen??

Gruß Sebastian

  1. Mahlzeit,

    wo kommen solche Funktionen hin, wo werden Sie aufgerufen??

    Sowas wird als Modul in PHP direkt integriert, also nicht als PHP-Code.
    Das Ganze wird dann entweder zur Laufzeit per dl() oder per extension=/pfad/zum/modul.so in der php.ini aufgerufen.

    __autoload z.B. kann als PHP-Code nicht funktionieren, da beim Aufruf der Klasse ja schon ein Error geworfen wird. Somit muss der Autoloader _vor_ dem Errorhandler greifen, was in PHP mMn nicht möglich ist.
    Wollte mal nen Autolader für Funktionen schreiben, da hatte ich das gleiche Problem.
    Ein passendes Modul hab ich zwar mal angefangen, wäre aber eh nur ne propitäre Lösung, da dieses Modul ja sonst überall installiert sein muss.

    1. __autoload z.B. kann als PHP-Code nicht funktionieren, da beim Aufruf der Klasse ja schon ein Error geworfen wird.

      Verstehe ich nicht. Derzeit steht am Anfang (relativ der Anfang) meiner index.php immer das:

        
      function __autoload($class) {  
          require_once("class/".$class.".class.php");  
      }  
      
      

      Das funktioniert Wunderbar.

      Meintest du was anderes??

      @ Problem, weiß nur halt net, wo ich die dan unterbringe.

      Gruß Sebastian

      1. Mahlzeit,

        Meintest du was anderes??

        Ja, ich meinte den autoload-Aufruf selbst, der praktisch vor dem Error-Handler greifen muss. Nicht die Funktion, die du selbst in PHP schreibst.

        Du erweiterst den Mechanismus ja quasi nur.

    2. echo $begrüßung;

      wo kommen solche Funktionen hin, wo werden Sie aufgerufen??
      Sowas wird als Modul in PHP direkt integriert, also nicht als PHP-Code.
      Das Ganze wird dann entweder zur Laufzeit per dl() oder per extension=/pfad/zum/modul.so in der php.ini aufgerufen.

      Achwas.

      __autoload z.B. kann als PHP-Code nicht funktionieren, da beim Aufruf der Klasse ja schon ein Error geworfen wird. Somit muss der Autoloader _vor_ dem Errorhandler greifen, was in PHP mMn nicht möglich ist.

      Genauso ist das __autoload()-Feature in PHP5 implementiert.

      Wollte mal nen Autolader für Funktionen schreiben, da hatte ich das gleiche Problem.
      Ein passendes Modul hab ich zwar mal angefangen, wäre aber eh nur ne propitäre Lösung, da dieses Modul ja sonst überall installiert sein muss.

      Kannst dir beim autoload-Code ein Beispiel nehmen :-)

      echo "$verabschiedung $name";

      1. Mahlzeit,

        Kannst dir beim autoload-Code ein Beispiel nehmen :-)

        Hab ich. Es wurden auch die Dateien nachgeladen, wenn eine Funktion nicht existiert hat.
        Die Erweiterung von PHP ist nicht wirklich schwer (wenn man C kann natürlich), aber nur bedingt sinnvoll, wenn die Scripte nicht nur auf einem einzigen Server laufen sollen.

  2. Hellihello

    http://framework.zend.com sollte alle deine fragen umfassend beantworten. Inklusive autoload und konfig/bootstrap...;

    Dank und Gruß,

    frankx

    --
    tryin to multitain  - Globus = Planet != Welt
    1. http://framework.zend.com sollte alle deine fragen umfassend beantworten. Inklusive autoload und konfig/bootstrap...;

      Nee, tuts nicht, da ich mir meine eigenes kleines (, hoffentlich feines) Framework basteln möchte, wo ich dann auch jede Ecke kenne und weiß, was ich hab. Zend ist mir zu groß.

      Gruß Sebastian

      1. echo $begrüßung;

        http://framework.zend.com sollte alle deine fragen umfassend beantworten. Inklusive autoload und konfig/bootstrap...;

        Nee, tuts nicht, da ich mir meine eigenes kleines (, hoffentlich feines) Framework basteln möchte, wo ich dann auch jede Ecke kenne und weiß, was ich hab. Zend ist mir zu groß.

        Du kannst dir aber dort Anregungen holen. Die haben dort nämlich trotz ihrer Größe genau die gleichen Probleme und dafür schon einen Lösungsweg implementiert.

        Konfigurationsdateien und allgemeine Hilfsfunktionen wie __autoload() laden ist im Grunde auch nichts anderes als Code-Dateien - beispielsweise für Klassen - zu laden (include usw.). Man kann deren Aufruf in die Bootstrap-Datei legen. Irgendwo musst du ja auch den Start des (MVC-)Controllers tätigen, und das ist ja auch außerhalb der drei Teile zu notieren, also bietet sich auch der Bootstrap an.

        echo "$verabschiedung $name";

        1. echo $begrüßung;

          Irgendwo musst du ja auch den Start des (MVC-)Controllers tätigen, und das ist ja auch außerhalb der drei Teile zu notieren, also bietet sich auch der Bootstrap an.

          Hier muss ich mich korrigieren. Das C von MVC ist im Zend Framework mit dem Action-Controller gleichzusetzen. Um aber überhaupt zu einem bestimmten Action-Controller zu gelangen, wertet der Front-Controller zunächst erstmal den Request aus und ruft daraufhin den entsprechenden Action-Controller auf (oder auch mehrere, man kann sie ja ketten).

          echo "$verabschiedung $name";

  3. Hi,

    Wie das funktioniert, ist mir eigentlich klar, nur frage ich mich zurzeit, wo den dann so Funktionen wie __autoload hinkommen. Außerdem solche Sachen wie eine Funktion von mir, die alle Konfigurationsdateien lädt, die gehört ja auch nicht in den Controller, wo kommen solche Funktionen hin, wo werden Sie aufgerufen??

    da PHP die Grundprinzipien von HTTP adaptiert (und somit jeder Request für sich steht), fehlt Dir eine leicht zugängliche Persistenzschicht. Der gängige Workaround (naja, von mir aus auch die gängige Lösung) ist die Erweiterung von MVC um einen Front-Controller. Dieser verwaltet jeden Request und enthält derlei (eher organisatorische) Dinge.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Der gängige Workaround (naja, von mir aus auch die gängige Lösung) ist die Erweiterung von MVC um einen Front-Controller. Dieser verwaltet jeden Request und enthält derlei (eher organisatorische) Dinge.

      Sowas habe ich mir auch schon gedacht, nur dachte ich, geht es auch irgendwie so, immerhin ließt man ja bei jedem PHP Framework, dass es auf MVC aufbaut und nicht auf MVCF.

      Gruß Sebastian

      1. Hi,

        Sowas habe ich mir auch schon gedacht, nur dachte ich, geht es auch irgendwie so, immerhin ließt man ja bei jedem PHP Framework, dass es auf MVC aufbaut und nicht auf MVCF.

        abgesehen davon, dass "MVCF" keine gebräuchliche Bezeichnung ist, basiert jedes MVC-Framework mit einem Front-Controller auf dem MVC-Pattern. Insofern sehe ich da keinen Widerspruch :-)

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
      2. echo $begrüßung;

        Der gängige Workaround (naja, von mir aus auch die gängige Lösung) ist die Erweiterung von MVC um einen Front-Controller. Dieser verwaltet jeden Request und enthält derlei (eher organisatorische) Dinge.
        Sowas habe ich mir auch schon gedacht, nur dachte ich, geht es auch irgendwie so, immerhin ließt man ja bei jedem PHP Framework, dass es auf MVC aufbaut und nicht auf MVCF.

        Es ist weder gesagt, dass MVC andere Patterns ausschließt beziwehungsweise sie nicht neben sich duldet (mitnichten (und dem Rest der buckligen Verwandtschaft)), noch dass es das alleinig seeligmachende Pattern ist. Andere Ansätze findest du beispielsweise mit MTV in Django (ein Python-Framework).

        echo "$verabschiedung $name";