Ankündigung

Einklappen
Keine Ankündigung bisher.

Welches Pattern?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Welches Pattern?

    Hallo@all

    Das was ich vor habe, ist etwas schwer zu beschreiben, aber ich versuches es einfach mal!

    Ich habe mir vor einer "ewigkeit" mal ein eigens MVC Framework Programmiert, welches seine Dienste sehr gut erfüllt.

    Dieses möchte ich jetzt mit einer Art Hilfestellung für den Programmierer erweitern .
    Jeder von euch wird es wohl kennen, dass man bei mehreren 100 Files durchaus mal den überblick verlieren kann.
    Grade wenn man ein Projekt erweitern möchte/muss, woran man eine längere Zeit nicht mehr gearbeitet hat. Man muss sich einfach wieder einlesen. Auch wenn man vieles gut Dokumentiert hat.
    Oder jemand anderes hat diese Projekt Programmiert, welches man jetzt erweitern soll.
    Wärend der entwicklung, könnte es sicher auch beim Debuggen helfen.

    Gewisse Informationen können diese Zeit der einarbeitung erheblich verkürzen.

    Beispiel welche Informationen ich Interessant finde.

    1. Welche Controller wurde bei einem Request ausgeführt
    2. Welches Layout wird bei diesem Request verwendet.
    3. Welche Template Datein werden angezeigt.
    4. Was steht in den Superglobalen Arrays. ( $_POST, $_GET, $_SESSION, usw. )
    5. Welche Plugins wurden verwendet. ( ACL, Multilanguage, PageBrowser, usw. )

    Ich finde, dass dies alles Informationen sind, die dafür Beitragen das ich sehr schnell einen überblick bekomme.

    Möchte der "Designer" nur was an einer ausgabe ändern weil er vieleicht ein Tipfehler gefunden hat als Beispiel, brauch er sich nur dort hinklicken und kann sehr schnell erkennen in welchem Template dieser Text steht.
    Ohne diese Information, müsste er sich erst durch die ganzen Templatefiles wühlen.
    Das gleiche gilt für den Programmierer, sehr schnell findet man den Controller den man haben möchte.

    So jetzt zur umsetzung des ganzen.
    Diese ganzen Informationen müssen ja erstmal alle gesammelt werden.
    Dafür habe ich mir jetzt 3 Regeln ausgedacht.

    1. Nur die Infos Sammeln während der Entwicklung, bzw. wenn ich dieses möchte.
    2. Framework und die ProgInfo ich nenne das jetzt mal so, sind unabhängig von ein ander. Also keine feste implentierung der ProgInfo.
    3. Es sollte keinerleih Performance einbussen durch die nicht nutzung vorhanden sein. Dies würde ja den Produktiveinsatz ja beeinflussen.

    Zum 1 Punkt, dies löse ich wie folgt.
    PHP-Code:
    // production, debug oder development?
    define('APPLICATION_ENVIRONMENT','development'); 
    Zu Punkt 2 da Grübel ich grade drüber.

    Was haltet Ihr hier wenn man das Subject / Observer Pattern verwenden würde? Macht das Sinn oder kennt Ihr noch eine besseren Lösungsweg?

    2 Frage, was haltet Ihr im Allgemeinen von dieser Idee?

  • #2
    hmm ich weis grad nicht was genau du meinst, aber meinst du z.b. sowas wie das was es hier für das zend framework gibt:

    Introducing the Scienta ZF Debug Bar - Joakim Nygård
    oder auch
    Zeltlblotzbuam.de V3.1

    Sowas liese sich ja wenn man es dementsprechend ausbaut und für das jeweilige framework anpasst auch durchaus so erweitert, dass es alle templates listen kann die gebraucht wurden, alle controller und actions sammelt etc ...

    Imho sollte man sich, immer überlegen ob man wie in deinem Vorschlag zu einem Observer(able) debug-code ins system fest einbauen will, die komplexität aller klassen die du überwachen können willst würde steigen, dann doch lieber eine art plugin das sich die gewünschten informationen selbst zusammensucht.

    Kommentar


    • #3
      Ja sowas meinte ich, wusste garnicht, dass es sowas schon gibt.

      Der Zweite Link passt irgendwie nicht zum Theman oder hab ich mich da jetzt vertan?

      dann doch lieber eine art plugin das sich die gewünschten informationen selbst zusammensucht.
      Ok aber wie komme ich dann an diese Informationen ran? Dafür bräuchte ich im Plugin ( ProgInfo ) ja alle Instanzen von gewissen Objekten.

      Bei Manchen wäre das kein Problem, weil die Singelton verwenden. Bei anderen würde es auch gehen, weil diese in der Registry liegen. Aber beim Frontcontroller wüsste ich jetzt nicht wie, außer ich übergebe alle Objekte im Constructor mit.

      Würde ja nur Stattfinden, wenn man Programmiert.

      Gibt es noch eine andere Variante.

      Kommentar


      • #4
        Warum nimmst du dir nicht einfach den Backtrace und analysierst den ? Erstens lässt er sich leicht ausstellen und belastet das System nicht weiter und zweitens kannst du den dann auf alle anderen Projekte, die genau das gleiche Framework einsetzen, anwenden. Das erste Schreiben von der Parserklasse dürfte halt aufwendiger ausfallen





        MfG
        dispy

        Kommentar


        • #5
          Zitat von Creator Beitrag anzeigen
          Ja sowas meinte ich, wusste garnicht, dass es sowas schon gibt.

          Der Zweite Link passt irgendwie nicht zum Theman oder hab ich mich da jetzt vertan?
          Bei 2ten Link ist so ein Teil im Einsatz, zeigt Fehler an etc (Javascript vorrausgesetzt)

          Ok aber wie komme ich dann an diese Informationen ran? Dafür bräuchte ich im Plugin ( ProgInfo ) ja alle Instanzen von gewissen Objekten.
          In irgendeiner Form müssen ja in jeder Architektur Objekte andere Objekte kennen, ich kenne dein Framework nicht, aber im ZF bekommt man sehr viel über den Frontcontroller bekommen, unter anderem das Response-Objekt, das Request-Objekt, den Router und so, andere Instanzen werden oftmals in der Registry des Frameworks abgelegt, die Datenbank-Klasse, die unterstützt beispielsweise Profiler die die Daten über alle Querys mitloggen können, die man sich dann da rausholen kann und so

          Kommentar


          • #6
            In irgendeiner Form müssen ja in jeder Architektur Objekte andere Objekte kennen, ich kenne dein Framework nicht, aber im ZF bekommt man sehr viel über den Frontcontroller bekommen, unter anderem das Response-Objekt, das Request-Objekt, den Router und so, andere Instanzen werden oftmals in der Registry des Frameworks abgelegt, die Datenbank-Klasse, die unterstützt beispielsweise Profiler die die Daten über alle Querys mitloggen können, die man sich dann da rausholen kann und so
            Du hast absolut recht, manch mal ist der einfachste weg auch der Sinnvollste!
            Ich denke immer gerne etwas zu Kompliziert.

            Kommentar


            • #7
              Also in meinem Framework liegen Informationen wie verwendeter Controller, Action, usw. im Request-Objekt

              Kommentar


              • #8
                Auch wenn ein Controller einen anderen Aufruft?

                Kommentar


                • #9
                  Nein, das steht da nicht drin... Ok, hab wohl das Problem falsch verstanden

                  Kommentar


                  • #10
                    Also in meinem Framework liegen Informationen wie verwendeter Controller, Action, usw. im Request-Objekt
                    Bei mir auch.

                    Auch wenn ein Controller einen anderen Aufruft?
                    Das gibt es in meinem Framework nicht, da ich das immer recht unübersichtlich finde.
                    Habt mal 50 Controller, die sich gegenseitig nach einer gewissen logik aufrufen.

                    Ich habe hier den einfachsten weg gewählt.
                    Meine Request Klasse, entscheidet an Hand einer ConfigLogik, was wann geladen wird.
                    Wenn der Page Parameter Controller1 übergeben wird, dann holt sich die Request Klasse aus einem Array die Informationen welche Controller noch bei diesem Request verarbeitet werden müssen.

                    Bis jetzt bin ich auf keine Probleme gestoßen. Controller können immer noch weitere Controllor einbinden wenn diese wirklich nicht anders gehen sollte.

                    Kommentar


                    • #11
                      Das habe ich nicht so ganz verstanden. Für mich sieht der Request erstmal so aus:
                      mypage.com/action1/var1/var2/action2/var3/var4

                      Daraus ist ersichtlich, dass 2 ActionController geladen werden. Mehr nicht.
                      Hast du nun zu jeder URL eine Konfiguration gespeichert, in der steht was wann aufgerufen wird?
                      Ganz schön fest verzahnt wenn du mich fragst. Da finde ich den DOM ähnlichen Ansatz des apf wesentlich eleganter.
                      Dort wird einfach über die Templates entschieden was noch geladen werden muss.

                      Kommentar


                      • #12
                        Über den Frontcontroller hatte ich mir damals viele gedanken gemacht.

                        Mein Lösung ist ziemlich simpel.

                        Eine Seite Teile ich in mehrere Funktionen.
                        Unter Funktionen verstehe ich folgendes als Beispiel:

                        1. Login, Logout, Registrieren, PW vergessen usw.
                        2. Forum
                        3. Newsletter
                        4. Suche
                        5. Newssystem

                        Bei mir ist jede diese Funktion ein Controller der sich bei bedarf Informationen über das Modules holt.

                        Eine URL schaut bei mir so aus.

                        http://www.mypage.de/index.php?page=...on=show_thread
                        oder halt mit mod_rewrite:
                        www.mypage.de/forum/show_thread.php

                        Die Request klasse greift jetzt auf die ConfigLogic Datei zu in dieser befindet sich ein Mehrdimensionales Array.

                        PHP-Code:
                        $configLogic = array('Forum' => array('Suche''Login''usw.'); 
                        wenn jetzt Forum als Page Parameter übergeben wird, dann werden die Controller Suche, Login, Forum ausgeführt.

                        In dem Controller Suche und Login wird default action ausgeführt. Beispiel das anzeigen des Loginformulars. In dem Controller Forum wird das ausgeführt, was in $_GET['action'] steht.

                        So bin ich unheimlich flexible und brauch mir keine gedanken machen wann und wo ich welchen Controller einbinde.

                        Möchte man das nicht, kann man Problemlos auch eine eigene HttpRequest Klasse schreiben, dafür ist es schön Abstract Programmiert.
                        Dort wird einfach über die Templates entschieden was noch geladen werden muss.
                        Das finde ich nicht so schön. Entspricht auch nicht dem MVC Strukturmuster denke ich zumindest.

                        Was willst du da machen, wenn die ausgabe der Informationen eine ganz andere ist? Also nicht HTML?

                        Kommentar


                        • #13
                          Wie die Controller/Klassen intern kommunizieren ist ja nochmal eine andere Sache - ich finde zum Beispiel EventListener toll.
                          Auf jeden Fall hab ich dich jetzt besser verstanden, gute Lösung!
                          Was mir an der Sache mit dem Controller Aufruf im Template gefällt ist, dass die Ausgabe eben genau dort erfolgt wo sie hingehört.
                          Wie ist das bei dir, schreiben die Controller alle einfach ins Response Objekt und müssen so quasi in der richtigen Reihenfolge in der Config eingetragen sein?

                          Kommentar


                          • #14
                            Wie ist das bei dir, schreiben die Controller alle einfach ins Response Objekt und müssen so quasi in der richtigen Reihenfolge in der Config eingetragen sein?
                            Nein wiel ich damit Ausgabenlogik und Programmlogik ja vermischen würde. Was ich nicht wollte.

                            Jeder Controller übergibt die Daten und welches Template an das View Objekt.
                            Er kan so viele Templates und Daten übergeben wie er will, schaut bei mir so aus.

                            PHP-Code:
                            $this->View->setTemplate('content''test.tpl'$value); 
                            $value ist nur innerhalb des Templates Gültig, da es sonst sehr schnell zu überschneidungen kommen könnte, wenn man mit mehreren Leuten an ein Projekt arbeitet.
                            Es gibt aber noch zusätzlich einen Globalen Datentopf. So kann bei gewissen Daten aus jedem Template drauf zugegriffen werden.

                            Um die Seite dann zusammen zu bauen, verwende ich Layouts diese difnieren dann wo was angezeigt wird.

                            Beispiel:
                            PHP-Code:
                            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
                            <html xmlns='http://www.w3.org/1999/xhtml'>
                            <head>
                                <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
                                <title></title>
                                <?= $this->layout->getCss();?>
                                <?= $this->layout->getJs();?>
                            </head>
                            <body>      
                                <?php $this->incCtrlTpl('content');?>
                            </body>
                            </html>
                            Man kann auch das layout z.b. nach Regeln wechseln lassen, wenn das von einem MOD oder Admin anders aussehen soll als das von einem User. Da sind die möglichkeiten grenzenlos.

                            Kommentar


                            • #15
                              So ich habe jetzt ein wenig was fertig.

                              Leider bin ich für die Ausgabe zu blöde.
                              Ich möchte das ganze in einem weiteren Fenster anzeigen lassen. ( Popup )

                              PHP-Code:
                              public function printProgInfo(){
                                      
                              ob_start();
                                      require_once(
                              LB_PATH_PLUGINS.'ProgInfo/templates/index.php');
                                      
                              $cach ob_get_contents();
                                      
                              ob_end_clean();
                                      echo 
                              $cach;
                                  } 
                              Wie bekomme ich $cach in das Popup?
                              Möchte eigentlich nicht erst noch eine Datei erstellen.

                              Wer eine Idee?

                              Kommentar

                              Lädt...
                              X