Ankündigung

Einklappen
Keine Ankündigung bisher.

MVC Klasse und Prinzip

Einklappen

Neue Werbung 2019

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

  • MVC Klasse und Prinzip

    Hallo,
    ich schreibe derzeit ein Projekt in PhP. Normalerweise bin ich eher von der JAVA und C# Seite und da wird das MVC Pattern etwas anders behandelt.
    Soweit so gut, ich habe mir einen FrontController geschrieben, weil ich zu jeder View einen eigenen Controller haben will und nicht den einen großen Controller:
    PHP-Code:
    <?php
    class Controller {

        private static 
    $sInstance null;
        
        private 
    $controllerPath;
        
        private 
    $controller;
        
        private 
    $configObject;

        public static function 
    getInstance() {
            if(
    self::$sInstance==null) {
                
    self::$sInstance = new Controller();
            }
            return 
    self::$sInstance;
        }

        public function 
    __construct() {
            
    $this->controllerPath $configObject->webroot."/controller/";
            
    spl_autoload_register("Controller::autoload");
            include_once(
    $this->webroot."/lib/AutoLoader.php");
            
    initConfigurationObject();
        }
        
        private function 
    initConfigurationObject() {
            
    $configObject ConfigDAO::getConfigurations();
        }

        public static function 
    autoload($pClass) {
            
    AutoLoader::getInstance($configObject->webroot);
        }
        
        public function 
    go() {
            
    $this->controller $_GET['page']."Controller";
            
    $this->controllerPath.= $_GET['page']."Controller.php";
            require_once(
    $this->controllerPath);
            if(!
    file_exists$_SERVER['DOCUMENT_ROOT'].$this->controllerPath)) {
                throw new 
    Exception("COULD NOT FIND CONTROLLER PATH ".$this->controllerPath);
            } 
            
            if(!
    class_exists$_SERVER['DOCUMENT_ROOT'].$this->controller,true)) {
                throw new 
    Exception("COULD NOT FIND CONTROLLER CLASS ".$this->controller);
            }
            
            
    $controller = new $this->controller($this->configObject->webroot$_GET['action'], $configObject);
            
            
    $controller->run();
        }
    }

    ?>
    Jeder Controller gehört dabei wie gesagt zu einer View und ist von der BaseController Klasse abgeleitet, die eigentlich nix macht außer die run() Methode vorgeben und 2 Member speichern.

    Die Frage ist nun, ob das optimal gelöst ist oder ob es schönere Wege gibt.
    Gerade die übergabe der page gefällt mir iwie nicht sonderlich.

    Weiter wurde mir gesagt, dass der Zugriff auf die Datenbank von den Modelklassen geregelt wird. Ich finde auch das nicht schön und habe wie in JAVA DAO Klassen dafür geschrieben. Vielleicht hat aber jmd von euch noch bessere Anregungen...

    Vielen Dank schonmal im Voraus!

    Lg
    Alex

  • #2
    Symfony
    "Dummheit redet viel..Klugheit denkt und schweigt.." [Amgervinus]

    Kommentar


    • #3
      APF
      Viele Grüße,
      Dr.E.

      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      1. Think about software design [B]before[/B] you start to write code!
      2. Discuss and review it together with [B]experts[/B]!
      3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
      4. Write [I][B]clean and reusable[/B][/I] software only!
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      Kommentar


      • #4
        Zitat von Alex04 Beitrag anzeigen
        ... weil ich zu jeder View einen eigenen Controller haben will ...
        Ungünstig. Eine klassische Anforderung ist: wenn das Programm die Formulareingaben erfolgreich verarbeitet hat soll auf die Seite weitergeleitet werden, die der Benutzer vor Aufruf des Formulars gesehen hat. Dort soll dann zusätzlich Feedback über die erfolgreiche Formularverarbeitung angezeigt werden. Das ist nicht umsetzbar, wenn der Controller, der ja für die Formularverarbeitung zuständig ist, den angezeigten View nicht frei wählen kann.

        Zitat von Alex04 Beitrag anzeigen
        ... und nicht den einen großen Controller:
        Das ist kein Grund, jedem Controller einen festen View zu geben.

        PHP-Code:
                if(!file_exists$_SERVER['DOCUMENT_ROOT'].$this->controllerPath)) { 
        Es ist sehr ungünstig, zu verlangen das dein Framework unterhalb vom Document Root liegt. PHP kann aus beliebigen Verzeichnissen Dateien einbinden.
        Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

        Kommentar


        • #5
          Das ist nicht umsetzbar, wenn der Controller, der ja für die Formularverarbeitung zuständig ist, den angezeigten View nicht frei wählen kann.
          Es spricht nichts dagegen. Für den Erfolgsfall kann es einen separaten Controller geben. Allerdings wäre es hier wirklich sinnvoller, den Controller entscheiden zu lassen, welchen View er benutzen möchte.

          Kommentar


          • #6
            Hallo und schonmal besten Dank für eure Antworten.

            Naja Symfony und APF kenn ich bzw bin während meiner Recherchen schon drauf gestoßen, allerdings wollte ich einen Controller selber schreiben. Erstens um mich einzuarbeiten und zweitens weiß ich nicht ob für meine Anwendung ein Framework nicht vielleicht etwas überzogen ist.

            Code:
            Es ist sehr ungünstig, zu verlangen das dein Framework unterhalb vom Document Root liegt. PHP kann aus beliebigen Verzeichnissen Dateien einbinden.
            Shit, stimmt, muss ich ausbessern und sollte natürlich nicht so sein, Danke!

            Code:
            Ungünstig. Eine klassische Anforderung ist: wenn das Programm die Formulareingaben erfolgreich verarbeitet hat soll auf die Seite weitergeleitet werden, die der Benutzer vor Aufruf des Formulars gesehen hat. Dort soll dann zusätzlich Feedback über die erfolgreiche Formularverarbeitung angezeigt werden. Das ist nicht umsetzbar, wenn der Controller, der ja für die Formularverarbeitung zuständig ist, den angezeigten View nicht frei wählen kann.
            Naja das kann ich ja so auch machen. Der Controller kann ja im Falle einer erfolgreichen Formularbearbeitung wieder auf die Ursprungsseite leiten. Das ist denk ich kein Problem.
            Weiter heißt ein Controller je View nicht, dass er nur diese eine statische seite anzeigen kann sondern je nach input usw natürlich die Ausgabe variiert.

            Beispiel(nur exemplarisch):

            PHP-Code:
            <?php
            class RegisterController extends BaseController{

                public static 
            $FULLMODE "FULL";
                public static 
            $SHORTMODE "SHORT";
                private static 
            $afterRegisterAction "postregister";

                private 
            $dialog;
                private 
            $registerMode;

                public function 
            __construct($pRoot$pAction$pConfigObject) {
                    
            parent::__construct($pRoot$pAction$pConfigObject);
                    
            $this->dialog = new RegisterDialog($this->configObject->captchaSecure);
                }

                public function 
            run() {
                    if (
            strcmp($this->actionself::$afterRegisterAction)) {
                        
            $this->handlePostRegister();
                    } else {
                        
            $this->handlePreRegister();
                    }
                }

                private function 
            handlePostRegister() {

                }

                private function 
            handlePreRegister () {
                    if(
            strcmp($this->registerModeself::$FULLMODE)) {
                        
            $this->dialog->showFullRegistrationDialog();
                    } else if(
            strcmp($this->registerModeself::$SHORTMODE)) {
                        
            $this->dialog->showShortRegistrationDialog();
                    }
                }
            }
            ?>
            Will heißen, ein RegisterController könnte auch einen LoginController kennen und den Nutzer dann direkt dorthin weiterleiten usw...

            Kommentar


            • #7
              Weiter heißt ein Controller je View nicht, dass er nur diese eine statische seite anzeigen kann sondern je nach input usw natürlich die Ausgabe variiert.
              Wenn Du dann trotzdem je Controller eine View hast,
              dann verlagerst Du Logik die in den Controller gehört in die View.

              Du hattest gefragt ob Deine Lösung optimal ist
              und Dir wurde gesagt, daß eine View je Controller nicht optimal ist.

              Wenn Du trotztdem auf Deiner "Lösung" beharrst: wieso fragst dann ?

              wieder auf die Ursprungsseite leiten.
              per header Location oder wie ?

              Je nach Request wird der Inhalt generiert
              und nicht mit header Location weitergeleitet.
              Eine if-else-Abfrage nimmt, ordentlich geschrieben eine Menge Platz weg. Platzsparend geht es mit einem ternären Operator.

              Kommentar


              • #8
                Zitat von dr.e. Beitrag anzeigen
                hehehe
                Dachte mir schon dass das kommt...
                "Dummheit redet viel..Klugheit denkt und schweigt.." [Amgervinus]

                Kommentar


                • #9
                  Na wenn du mir so eine geniale Vorlage bietest!
                  Viele Grüße,
                  Dr.E.

                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                  1. Think about software design [B]before[/B] you start to write code!
                  2. Discuss and review it together with [B]experts[/B]!
                  3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                  4. Write [I][B]clean and reusable[/B][/I] software only!
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                  Kommentar


                  • #10
                    Zitat von Koala Beitrag anzeigen
                    Wenn Du dann trotzdem je Controller eine View hast,
                    dann verlagerst Du Logik die in den Controller gehört in die View.

                    Du hattest gefragt ob Deine Lösung optimal ist
                    und Dir wurde gesagt, daß eine View je Controller nicht optimal ist.

                    Wenn Du trotztdem auf Deiner "Lösung" beharrst: wieso fragst dann ?


                    per header Location oder wie ?

                    Je nach Request wird der Inhalt generiert
                    und nicht mit header Location weitergeleitet.
                    Zuerst mal wieder danke für eure Antworten!!!

                    @Koala
                    Naja was heißt
                    Code:
                    Wenn Du trotztdem auf Deiner "Lösung" beharrst: wieso fragst dann ?
                    Naja wenn mir Gründe genannt werden die so nicht richtig sind, dann muss ich ja wohl weiter argumentieren oder nicht?!

                    per header Location oder wie ?
                    Nein nicht per headerlocation. Das geht beispielsweise auch indem der Controller mittels des Config objekts, das er Standardmäßig immer beim Erstellen im Ctor bekommt, die location in der Formular action setzt.

                    Da ist weder headerlocation, noch eine Weiterleitungsview vorhanden...

                    Versteh mich bitte nicht falsch, ich glaub dir gerne, dass meine Lösung nicht optimal ist. Ich finde sie ja selber noch nicht so toll, nur der genannte Grund leuchtet mir nicht ein.
                    Bzw. hättest du einen Vorschlag das besser zu lösen ?

                    Kommentar


                    • #11
                      Zitat von Alex04 Beitrag anzeigen
                      Bzw. hättest du einen Vorschlag das besser zu lösen ?
                      So wie wohl jedes Framework auch: ein Controller, viele Views.
                      Aber das willst du ja nicht hören.

                      Man muss übrigens nicht zu jeder angeblichen Lösung ein Problem herbeikonstruieren - man darf auch schon vorher erkennen, dass es unsinnig ist.
                      VokeIT GmbH & Co. KG - VokeIT-oss @ github

                      Kommentar


                      • #12
                        Beispiele:

                        - Du hast einen Newcontroller und möchtest je nach Anforderung
                        die Daten als XML, als HTML, pdf oder RSS-Feed ausgeben.
                        Du würdest hier also 4 nahezu identische Newscontroller machen.

                        - Du hast eine Seite welche dem User Fehler anzeigt.
                        Machst jetzt einen Newserror-Controller, einen Eventerror-Controller
                        und jeweils ne View dazu ? Obwohl die View immer gleich ist
                        und nur mit anderen Fehlermeldungen ausgeliefert wird ?

                        Oder ist es nicht sinnvoller daß der Newscontroller
                        beim Auftreten eines Fehlers die Errorview mit den nötigen Daten
                        versorgt und wenn keiner auftritt eben die Newsview ?
                        Eine if-else-Abfrage nimmt, ordentlich geschrieben eine Menge Platz weg. Platzsparend geht es mit einem ternären Operator.

                        Kommentar


                        • #13
                          Hallo,

                          wieder besten Dank für die Antworten.

                          So wie wohl jedes Framework auch: ein Controller, viele Views.
                          Aber das willst du ja nicht hören.
                          Wo genau steht, dass ich das nicht hören will?

                          Ein Controller für alle Views hört sich für mich sehr gut an und ist für mich bei kleineren Projekten auch immer die Regel gewesen.

                          Ich frag mich nur, wenn die ganze Anwendungslogik in nur einem Controller steckt, ist dass dann nicht etwas überladen bei mittleren bis großen Projekten?
                          Klar kann ich evtl mit Vererbung usw die Logik auf ein paar Klassen verteilen, allerdings ist das schon noch ein beachtlicher Teil...

                          Wie realisiert man denn dann diesen Controller?
                          Steckt da wirklich jede funktionalität der Views drin?
                          Will heißen, hab ich dann wirklich die Funktionen Login, Register, Logout usw alles über diesen zentralen Controller geregelt?

                          Oder ist es dann so geregelt, dass man Controller je "Kategorie" hat.
                          Beispiel:
                          Ich habe nen MemberController
                          Dieser regelt ua MemberlisteView, MemberProfileView usw.
                          NewsController
                          Dieser regelt news via xml, pdf usw.

                          Oder ich raff einfach das gesamte MVC iVm php noch nicht

                          Lg
                          Alex

                          Kommentar


                          • #14
                            Bei meinem Framework habe ich es so gelöst, dass jede "Action" ein View hat. Sie kann allerdings auch manuell ein View festlegen (So lassen sich z. B. zentrale Fehlerseiten anzeigen). Jedes View hat noch mal je nach Bedarf verschiedene Ausgabeformate - i. d. R. HTML. Allerdings sind auch json, xml, etc. möglich.

                            Ein Controller für alle Views hört sich für mich sehr gut an
                            Um Himmels Willen! Du willst eine komplette Applikation in einem Controller unterbringen?! Das ist ganz schlecht, weil die Übersicht flöten geht und Du keine Möglichkeit hast, die Applikation in mehrere Ebenen zu unterteilen (z. B. auth/login, auth/register - Stattdessen hättest Du so was wie auth_register, auth_login, usw.)

                            Ich frage mich gerade, warum Du Dir nicht einfach mal - wie bereits gesagt - fertige PHP-Frameworks anschaust und Dir anschaust, wie das dort gemacht wird. Du musst es ja nicht so wie diese umsetzen, aber ich denke, dann siehst Du erst mal die richtige Richtung..

                            Kommentar


                            • #15
                              Zitat von Alex04 Beitrag anzeigen
                              [...]

                              Ich frag mich nur, wenn die ganze Anwendungslogik in nur einem Controller steckt, ist dass dann nicht etwas überladen bei mittleren bis großen Projekten?

                              [...]
                              Dann hat man mehr als einen Controller.

                              Kommentar

                              Lädt...
                              X