Ankündigung

Einklappen
Keine Ankündigung bisher.

MVC & Zend & Ajax - Software-Design

Einklappen

Neue Werbung 2019

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

  • MVC & Zend & Ajax - Software-Design

    Simple Aufgabe:
    Nehmen wir an wir haben eine Webseite mit einer Tabelle und ganz unten einen Button.

    Wenn man auf diesen Button drückt soll Tabelle zerstört werden und vollkommen bzw. teilweise neu geladen werden.

    Die Seite soll sich jedoch nicht neu laden.
    ______

    Simple Umsetzung:
    Mit Hilfe von jQuery kann man schnell selektieren wo was gelöscht werden soll und wo was geaddet werden soll.
    Die Frage ist, wie sieht die Struktur der Quelldatei für die Daten aus ?
    _______

    Beispiel:
    Wir drücken auf den Button.

    1.)
    Gibt es besondere Richtlinien die man einhalten muss zur Ausgabe ?
    Sagen wir, wir haben uns für das JSON Format entschieden und holen die Daten von /api/calendar/events?day=11-11-2011.

    Sprich darf man es überhaupt API nennen oder gehört es in die normale MVC Struktur ?


    Oder besser gefragt:
    Wenn man Daten holt, ohne eine bestimmte Seite anzeigen zu lassen, sondern eben (<-Grüße an Nikosch ) die Schnittstelle nur zum nachladen von Daten braucht, gibt es dann dafür einen extra Controller in der MVC Struktur oder haut man das in den normalen Controller (dementsprechend ebend nur über eine extra Action wie z.B. "getEvents") worüber auch die App aufgerufen wird ?

    2.)
    Gibt es spezielle Schnittstellen o.Ä. wo das ZF genau an dieser Ecke ansetzt ?

    Damit meine ich gibt es vllt. eine Klasse die genau dies zum Ziel hat ?

    Das Ziel ist z.B. das gesamte layout nicht ausgeben zu lassen.
    Das geht noch leicht indem man das render() auf false setzt, jedoch hat die Klasse vllt. auch noch andere Tricks auf Lager um bestimmte Konventionen einzuhalten.

    ____________________________________

    Das sind die Fragen.

    Es ist schwierig eine Frage nach Konventionen zu stellen, wenn man diese nicht kennt.

    "Murksig" schreiben kann es jeder, aber wie schreibt man es schön sauber und strukturiert ?

    Darum geht es mir.
    Wenn etwas unverständlich ist, bitte einfach nachhaken


  • #2
    http://framework.zend.com/manual/en/....contextswitch

    Kommentar


    • #3
      (dementsprechend ebend nur
      Grüße zurück.

      Was hindert Dich daran, einen zweiten Controller aufzusetzen? Letztlich ist die JSON-Repräsentation doch nur eine andere Form der View.
      --

      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


      --

      Kommentar


      • #4
        @nikosch
        Das ist nicht der Kern der Frage.
        Es ist möglich es als Action in einen zweiten Controller zu packen, das steht außer Frage.

        Die Frage ist, wie so etwas "best practise" umgesetzt wird.

        Fragt man per extra Controlller die Daten, die im Hintergrund geladen werden ab ?
        Liegt dieser Controller im selben "Modules" Verzeichnis oder gibt es ein extra "Modules" Verzeichnis namens API ?

        Ich geb mal Praxisbeispiele:

        1.) /api/calendar/getEvents [in einem extra Modul namens "API" ausgelagert]
        2.) /xx/calendar/getEventsJson [Im gleichen Modul nur mit einer anderen Action]
        3.) /xx/calendar/api?get=events&param1=bla [Extra Action für alle Ajax requests im gleichen Modul]
        4.) /xx/calendar/getEvents/format/Json
        [Neu, dank dem Link von lcrash möglich.]
        Frage: Ist das nicht eigentlich das Gleiche wie eine extra Action anzulegen, nur mit dem Unterschied ebend in dieser Action ContextSwitch() zu verwenden ?
        Ich denke, dass entweder Variante 1 oder Variante 4 in Frage kommt.
        Wobei Variante 1 auch mit lcrashs Post gekoppelt sein kann.

        Es gibt noch mehrere weitere Varianten die möglich wären.

        Die Frage ist nur:
        Worin (Welchen Fall) findet sich ein fremder Programmierer im Quellcode am besten zu recht ?
        Gibt es Konventionen an die man sich dort am besten hält ?

        Kommentar


        • #5
          Es gibt nicht DIE Lösung. Und Pfade/Urls sagen sowieso nichts über die Struktur aus.
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Der Sinn von Modulen ist ja, dass diese gekapselt sind.

            Möglich ist also:
            /mymodule/api_data/index/format/json und der Pfad ist application/modules/mymodule/controllers/Api/DataController.php
            Ist ein wenig hässlich. Wenn man das sauber haben möchte muss man dafür eine eigene Router-Route schreiben.

            Kommentar


            • #7
              Was spricht gegen die ContextSwitch-Methode? Das ist in meinen Augen am saubersten.

              Kommentar


              • #8
                ContextSwitch ist eher für einfache Switches geeignet. Für richtige APIs sollte es schon Zend_Rest_Controller und Zend_Controller_Router_Route_Rest sein.

                Es schient auch zunächst, dass er keine ganze API möchte, sondern einfach nur ein anderes Ausgabeformat.

                Kommentar


                • #9
                  sondern einfach nur ein anderes Ausgabeformat.
                  Das spricht doch für die ContextSwitch-Methode..

                  Kommentar


                  • #10
                    Ja das kann er auch weiterhin in seiner API benutzen. War nicht so gemeint, dass dies dann ausgeschlossen ist.

                    Kommentar


                    • #11
                      Boah lcrash du bist einfach gut.

                      Wieder einer dieser "Aha" Effekte.
                      Klar, man macht nen unterverzeichnis im Modul selbst namens API und durch die URL ruft man es durch api_ auf.

                      Genau DAS meine ich.
                      Es ist mir bekannt wie es funktioniert (Stichwort Namespaces) aber auf so eine Idee komme ich überhaupt nicht weil ich es auch nirgends bisher sah.

                      Dadurch erübrigt sich nämlich auch die Herausforderung der "Unsauberheit" im Code.

                      Denn wenn ich ein vollständig eigenständiges Module erstelle namens API muss ich entweder auf die DB-Tables der MyModule zugreifen oder ich erstelle sie doppelt, also nochmal neu im API Module.

                      Es gibt auch Tutorials im Netz zu Ajax und Zend, aber sie setzen überwiegend immer anders an und dein Vorschlag habe ich noch nirgends gesehen.

                      Der einzige Nachteil der mir auffällt ist, dass ich via Zend_Tool wohl /mymodule/controllers/api/DataController.php nicht erstellen kann.
                      (Selbst wenn der Folder angelegt ist)
                      Sprich alle Dateien in diesem Unterverzeichnis müssen immer per Hand (manuell) erstellt werden.
                      Oder gibt es für Zend_Tool in diesem Fall auch einen "Hack" ?

                      Bevor ich den Post absende teste ich mal einiges... und es klappt doch... zumindest teilweise
                      Lösung:
                      zf.sh create controller Api/Data 1 mymodule
                      Dann wird es im /Api Verzeichnis erstellt.
                      Jedoch ist der Klassenname "defekt".

                      class Mymodule/Api_DataController extends Zend_Controller_Action
                      Muss natürlich entsprechend geändert werden in:

                      class Mymodule_Api_DataController extends Zend_Controller_Action
                      ____________________

                      Update1://
                      Achja und zu der Diskussion ob es eine vollständige API ist oder nicht:

                      Das weiß ich selbst nicht, das war auch Inhalt dieses Threads.
                      Eigentlich brauche ich es nur, damit ich via XHTML Request (Stichwort Ajax) Daten im Hintergrund laden kann.

                      Die Frage ist halt nur wo finden die entsprechenden Actions ihren Platz.
                      - in einem ausgelagertem API Modul
                      - im selben Controller im gleichen Modul
                      - in einem anderen Controller im gleichen Modul.

                      Die jetzige Lösung gefällt mir ganz gut und schein auch übersichtlich zu sein:
                      Im selben Modul in einem extra API Verzeichnis

                      Kommentar


                      • #12
                        Danke. Die Idee kommt ursprünglich von Ryan Mauger und war für admin_* gedacht. Es müsste auch möglich sein mehrere Controller-Directories zu haben und Module ineinander zu verschachteln. Das würde aber einige Arbeit bedeuten.

                        Unbedingt ansehen:
                        PHP-Code:
                        <?php
                        class Mymodule_Api_DataController extends Zend_Rest_Controller
                        {
                        }
                        Das kann Zend_Tool sowieso nicht leisten. Insofern kein Verlust.

                        Die Frage ist halt nur wo finden die entsprechenden Actions ihren Platz.
                        - in einem ausgelagertem API Modul
                        - im selben Controller im gleichen Modul
                        - in einem anderen Controller im gleichen Modul.
                        Das kommt auf den Anwendungsfall an. Ein API-Modul wäre wohl für eine super-globale API nützlich (z.B. für sowas wie Facebook hat), einen Controller wenn es um eine API für das Modul handelt (z.B. News-Modul und die API dient zum Zugriff auf diese Daten) und eine einfache action für einfache Sachen wie ein XHR-Request.

                        Kommentar


                        • #13
                          Danke für die guten Praxisbeispiele.

                          Die Abgrenzung zwischen eigenem Controller (News Modul) und nur "actions" habe ich aber noch nicht ganz mitbekommen.

                          Ab wann fängt eine API an ?
                          So bald man sie auch "extern" von der Applikation nutzt ?

                          Sind 3-6 XHR Requests für z.B. eine Kalendarapplikation welcher nicht von außen abgefragt wird sondern einfach nur zum Absetzen und Empfangen der Daten einen extra Controller wert ?

                          Oder anders gefragt:
                          Wann wann fängt eine API für ein Modul an und was sind "nur Actions" (wären das z.B. 10 XHR Requests ?) für das Modul ?

                          Kommentar


                          • #14
                            Wozu mehrere Actions, wenn du eine Action + ContentSwitch haben kannst.

                            Es gibt auch interne APIs. Wann du was machst muss du selbst wissen.

                            Kommentar


                            • #15
                              Ab wann fängt eine API an ?
                              So bald man sie auch "extern" von der Applikation nutzt ?
                              Würde ich so sagen. Oder aber - siehe lcrash - ist ein Modul so eigenständig, dass Du es über seine eigene Schnittstelle ansprichst.

                              Zur „HTTP-Api“ gehört letztlich auch das URL-Layout und deren Mapping auf die Applikation. Genau genommen kann das URL-Schema irgendwann die einzige Konstante sein (neben dem impliziten Verhalten), während sich der Rest als eine Art Blackbox komplett verändert.
                              --

                              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                              --

                              Kommentar

                              Lädt...
                              X