Ankündigung

Einklappen
Keine Ankündigung bisher.

mvc 'mal anders'

Einklappen

Neue Werbung 2019

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

  • mvc 'mal anders'

    Hi,
    ich treibe heute wieder mein Unwesen und hab ne Frage zu folgendem SW-Design:

    > View: "Normale" .php Dateien

    > Controller: Ein php Script (keine Klasse, nur ein File mit Funktionen), das per ajax über jquery (per jquery über ajax ) durch eine Aktion auf der View aufgerufen wird

    > Model: Meine Klassen, die vom Controller angesprochen werden und die Daten aus der db oder ähnlichem holen und an den Controller zurückgeben.
    Der Controller gibt diese wiederum an die View weiter.


    Ist sowas vertrebar ?
    Komme von C#, wo ich beim mvc eine Klasse als Controller habe (kein php file wie oben), welches von einer Klasse "Controller" ableitet.

    Regards
    No Sacrifice , no Glory--


  • #2
    Meinst du so was in etwa?

    http://stackoverflow.com/questions/4...procedural-php

    LG
    https://github.com/Ma27
    Javascript Logic is funny:
    [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

    Kommentar


    • #3
      An sich ist es ja eher ein "Mix". Im Model nutze ich Klassen (user, adressen etc.), mein Controller ist aber prozedural .
      Weiß nicht ob das komform ist, oder ich den Controller auch zwingend als Klasse machen muss ? (Wenn er eh nur eine Methode enthält, z.B. validate_passwort_reset($newPassword))..?
      No Sacrifice , no Glory--

      Kommentar


      • #4
        Functions als Controller Actions ist nichts das gegen das MVC Prinzip generell verstößt. Controller sollen Actions separieren, was du ja tust. Nichts anderes tun Micro-Frameworks indem sie Closures an Routes binden. Zumindest solange du nicht ein PHP Script als Function-Mülltonne missbrauchst und grundsätzlich alle Actions dort parkst. MVC ist in erster Linie wie jedes OOP-Konstrukt eine Methode zur Code Gliederung.

        Sollte einleuchten.
        [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

        Kommentar


        • #5
          du wirst dabei bei dem Controller an einige Probleme Stoßen,

          erstmal die dependencies, um es sauber zu machen, übergibst du deinem Controller die instanzen der klassen im constructor so dass du intern keine instanzen erstellen musst. (Inversion of Control principle)

          bei einer funktion wird es schwierig

          dann hast du das Problem der Parameter, du hast i.d.r Router Parameter oder Parameter aus dem Request Objekt oder hast Parameter die sonstwoher kommen(Session,Configs, Controller die vorher ausgeführt wurden HMVC)

          Parameter UND Dependencies in eine funktion zu pumpen halte ich für unmöglich

          vielleicht irre ich mich aber auch
          apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

          Kommentar


          • #6
            Zitat von BlackScorp Beitrag anzeigen
            du wirst dabei bei dem Controller an einige Probleme Stoßen,

            erstmal die dependencies, um es sauber zu machen, übergibst du deinem Controller die instanzen der klassen im constructor so dass du intern keine instanzen erstellen musst. (Inversion of Control principle)

            bei einer funktion wird es schwierig

            dann hast du das Problem der Parameter, du hast i.d.r Router Parameter oder Parameter aus dem Request Objekt oder hast Parameter die sonstwoher kommen(Session,Configs, Controller die vorher ausgeführt wurden HMVC)

            Parameter UND Dependencies in eine funktion zu pumpen halte ich für unmöglich

            vielleicht irre ich mich aber auch
            Also da geht schon was, man kann Functions via Reflections als Closures isolieren und diese dann an Instanzen binden, dort kannst du dann alle Dependencies liefern. Du musst nur sicherstellen das die Methode auch nur auf dem Weg aufgerufen wird.

            PHP-Code:
            function test()
            {
                return 
            $this->foo;
            }

            class 
            FacadeBinding {
                private 
            $foo 'Test';
            }

            $reflection = new ReflectionFunction('test');
            $callback $reflection->getClosure()->bindTo(new FacadeBindingFacadeBinding::class);
            echo 
            $callback(); 
            result
            Code:
            Test
            [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

            Kommentar


            • #7
              Evtl. verstehe ich das mit den Dependencies nun falsch, aber habe nen Autoloader gebaut der mir die notwendigen Klassen reinlädt. Parameter werden über das ajax Element param:{} an den Controller übergeben.

              Nehme ich die Form Validation dann in dem Controller vor oder direkt im Model ?

              Beispiel:
              1):
              PHP-Code:
              // Controller
              session_start();

              function 
              validate_passwort($pw){
              include(
              "autoloader.php");
              $fehler "";

              if(
              strlen(trim($pw)) < 5){
               
              $fehler .= "Passwort zu kurz";
              }else{
                
              $model->setPasswort($pw);
                
              $model->save();
              }

              return 
              $fehler;
              }

              // Model
              function setPasswort($pw){...}
              function 
              save(){
               
              // update query

              oder 2)
              PHP-Code:
              // Controller
              session_start();

              function 
              validate_passwort($pw){
              include(
              "autoloader.php");
              return 
              $model->setPasswort();
              }

              // Model
              function setPasswort($pw){
                
              $fehler "";
                if(
              strlen(trim($pw))<5){
                
              $fehler .= "Passwort zu kurz";
                }else{
                 
              save();
                }
                return 
              $fehler;
              }
              function 
              save(){
               
              // update query


              Edit: Der Punkt hat sich geklärt mit: http://stackoverflow.com/questions/5...ntroller-model

              Validierungen, die keine "Applikations-Logik" benötigen kann ich im Controller lassen, Validierungen die z.B. die DB benötigen muss ich ins Model auslagern.
              Regards
              No Sacrifice , no Glory--

              Kommentar


              • #8
                @tr0y,

                hab dein Beispiel gerade mal in PHPStorm ausprobiert.
                Es mag zwar eine gute Lösung sein, aber die IDE Unterstützung fällt weg, oder ist es mir nur entgangen, dass man sich die Unterstützung durch DocBlocks wieder holen kann?

                LG
                https://github.com/Ma27
                Javascript Logic is funny:
                [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

                Kommentar


                • #9
                  @Sakron,

                  es wäre vielleicht noch ganz gut, wenn du nen Autoloader, wie den vom Composer nutzt

                  LG
                  https://github.com/Ma27
                  Javascript Logic is funny:
                  [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

                  Kommentar


                  • #10
                    Gerade das Beispiel von sakron macht deutlich, warum eine zentrale Bootstrap-Datei Sinn macht. Einige Tasks werden eben ständig wiederholt...
                    Standards - Best Practices - AwesomePHP - Guideline für WebApps

                    Kommentar


                    • #11
                      Ich dachte bisher, dass ne zentrale Bootstrap die Norm sei...
                      Die Vorteil davon liegen doch auf der Hand

                      LG
                      https://github.com/Ma27
                      Javascript Logic is funny:
                      [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

                      Kommentar


                      • #12
                        Ich dachte, dass prozedurale Programmierung ausgedient hat und dass gute Softwarearchitektur mittlerweile allgemeiner Konsens ist...
                        Standards - Best Practices - AwesomePHP - Guideline für WebApps

                        Kommentar


                        • #13
                          Ein Autoloader ist doch bereits eingebaut / eingebunden in jeder Datei, wo er benötigt wird.
                          (In dem File wo der Autoloader initialisiert wird (autoloader.php) werden auch andere wichtige Startdinge initialisiert. Somit ist das ja mein Bootstrap file)
                          No Sacrifice , no Glory--

                          Kommentar


                          • #14
                            Hallöchen,

                            Zitat von Sakron Beitrag anzeigen
                            Ein Autoloader ist doch bereits eingebaut / eingebunden in jeder Datei, wo er benötigt wird.
                            (In dem File wo der Autoloader initialisiert wird (autoloader.php) werden auch andere wichtige Startdinge initialisiert. Somit ist das ja mein Bootstrap file)
                            Die unnötige Wiederholung fängt doch bereits dort an, wo du in jedem "Controller" deinen Autoloader einbinden musst. DRY lautet das Stichwort. Und welche konkreten Ziele du hierbei verfolgst, ist mir auch schleierhaft.

                            Zitat von Sakron Beitrag anzeigen
                            Ist sowas vertrebar ?
                            Komme von C#, wo ich beim mvc eine Klasse als Controller habe (kein php file wie oben), welches von einer Klasse "Controller" ableitet.
                            Es gibt keinen ersichtlichen Grund, weshalb du in PHP nicht auch einen Controller in Form einer Klasse aufbauen solltest.

                            Viele Grüße,
                            lotti

                            Kommentar


                            • #15
                              Zitat von Sakron Beitrag anzeigen
                              Validierungen, die keine "Applikations-Logik" benötigen kann ich im Controller lassen, Validierungen die z.B. die DB benötigen muss ich ins Model auslagern.
                              Regards
                              oder du kannst alle validierungen an ein ort packen und einen validator benutzen, sprich, du baust ein plain php object der ledeglich public eigenschaften hat die sowohl in der DB als auch in deiner Form vorhanden sind so dass der validator eben nur das objekt validiert. um es an einem beispiel zu zeigen

                              https://github.com/Opentribes/Core/b...gistration.php das ist der Plain Object mit eigenschaften die in der Form auftauchen(password Confirm, accept Terms) und eigenschaften die nur die datenbank kennt(unique Username,email)

                              du setzt vorher einfach alle diese eigenschaften und kannst an einer stelle validieren
                              https://github.com/Opentribes/Core/b...on.php#L30-L63

                              zu dem autoloader vs dependencies.

                              mit hilfe des autoloaders kann man sehr schnell in versuchung kommen, einfach klassen aufzurufen und deren methoden zu verwenden, du nutzt die klassen dann als seien die global, die befinden sich irgendwo und du erstellst einfach eine instanz.

                              https://github.com/Opentribes/Core/b...nt.php#L34-L38

                              hier siehste dass die klassen die NUR an der stelle also nur im Controller benutzt werden, werden dann innerhalb des controllers instanziert, alle "helfer" klassen werden über den constructor übergeben, zu einem stelle ich dadurch sicher dass der Controller garnicht instanziert werden kann, wenn die klassen nicht vorhanden sind(es kommt eine exception noch vor dem ausführen und nicht mittendrin) zum anderen bin ich in der lage die helper klassen von außen zu ersetzen ohne im controller rumfummeln zu müssen

                              ich glaube deine Idee , wieso du einfache dateien benutzen willst statt controller klassen, willst du umsetzen um weitere funktionen in die webseite zur verfügung zu stellen. zu diesem zweck wird i.d.r Service Locater oder DI Container benutzt, die Idee ist, du hast ein behälter für objekte und dieses befüllst mit klassen, du kannst anschließen plugins oder ähnliches einbauen, diese plugins würden die bereits befüllten klassen im container durch eigene ersetzen

                              vielleicht habe ich aber auch einfach alles falsch verstanden who knows
                              apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

                              Kommentar

                              Lädt...
                              X