Ankündigung

Einklappen
Keine Ankündigung bisher.

Parameter für Controller-Funktionen

Einklappen

Neue Werbung 2019

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

  • Parameter für Controller-Funktionen

    Hallo Community,

    ich möchte innerhalb eines Controllers den Funktionen Parameter zuweisen. Diese sollen direkt über die URL übergeben werden können, also z.B. mit http://www.example.org/cms/viewpage/...9/Testtitel/5/. Nun sollte die Viewpage-Methode mit den Parametern 29_12_09, Testtitel und 5 (der Reihe nach) gefüttert werden, ohne dass ich das nun explizit für jede Funktion und jede Parameteranzahl in der .htaccess definieren müsste.

    Wie könnte ich das mit mod_rewrite realisieren?

    Grüße aus Bayern,
    Simon


  • #2
    Hallo DerApfel,

    mit mod_rewrite wirst du das nicht lösen können. Hierzu hatten wir vor einiger Zeit mal eine Diskussion im Softwaredesign-Forum. Die Lösung ist, eine generische RewriteRule und ein Parser, der das in die entsprechende Form, die die Applikation versteht, übersetzt. Im APF ist das über dedizierte Input-Filter für den Front-Controller gelöst, die ein URL-Schema in Action-Anweisungen und Parameter übersetzen.
    Viele Grüße,
    Dr.E.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1. Think about software design before you start to write code!
    2. Discuss and review it together with experts!
    3. Choose good tools (-> Adventure PHP Framework (APF))!
    4. Write clean and reusable software only!
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Kommentar


    • #3
      Kurze Frage: Welchen Mehrwert bietet die Gestaltung einer URL auf diese Weise?

      Kommentar


      • #4
        Je nach System:
        - Schönheit/Lesbarkeit
        - SEO Gründe
        - Systematik fürs MVC-Actioncontrolling
        --

        „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


        • #5
          Insbesondere letzteres bietet die Möglichkeit, Applikationen, die nach dem Front-Controller-Pattern implementiert sind, sauber über die URL zu entkoppeln.
          Viele Grüße,
          Dr.E.

          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          1. Think about software design before you start to write code!
          2. Discuss and review it together with experts!
          3. Choose good tools (-> Adventure PHP Framework (APF))!
          4. Write clean and reusable software only!
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

          Kommentar


          • #6
            Stimmt, eigentlich war MVC als Stichwort hier etwas irreführend. Richtiger ist, dass Rewrite-URLs jedes entsprechend gestaltete generische Controlling ansprechen kann.
            --

            „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


            • #7
              Wobei hier nicht zwingend URL-Rewriting eingesetzt werden muss, es geht vielmehr um das URL-Layout. Es muss einfach die Möglichkeit bieten, mehrere Front-Controller-Action-Anweisungen aufzunehmen und es bedarf einer Komponente, die das Layout versteht und umsetzen kann. Sofern das gegeben ist, ist alles in Butter.
              Viele Grüße,
              Dr.E.

              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
              1. Think about software design before you start to write code!
              2. Discuss and review it together with experts!
              3. Choose good tools (-> Adventure PHP Framework (APF))!
              4. Write clean and reusable software only!
              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

              Kommentar


              • #8
                Dazu hätte ich allerdings eine Frage: Wie kann das Programm wissen, welche Programmkomponenten durch die URL angesprochen werden? Nehmen wir beispielsweise folgende URL:

                http: //www. php. de/software-design/64796-parameter-fuer-controller-funktionen.html#post495118

                Wie kann anhand der URL beispielsweise erkannt werden, dass es sich um den Bereich "Software-Design" und um das Thema "Parameter für Controller" handelt? Es müssen doch irgendwelche Rahmenbedingungen dazu existieren. Entschuldigung, aber mir fehlt da irgendwie der richtige Einblick.

                Kommentar


                • #9
                  Hallo,

                  ich hätte mir hierfür einfach eine RewriteRule definiert:
                  Code:
                  RewriteEngine On
                  RewriteRule /(.*)/(.*) index.php?board=$1&params=$2
                  Und dann die Parameter, die ja nun einfach per GET übergeben werden, ausgewertet.

                  Grüße,
                  Simon

                  Kommentar


                  • #10
                    Wenn man jedoch das URL-Design feste Richtlinien zuordnet, dann geht doch ein Stück weit Flexibilität verloren. Beispielsweise könnte einem Teilfragment der URL keine optionale Anzahl an Parametern zugewiesen werden, da nur der letzte Abschnitt der URL eine optionale Anzahl von Parametern aufnehmen kann. Was ich damit ausdrücken möchte:

                    www . meinewebseite . de / Modul / Aktion 1 / Aktion 2 / Aktion 3 / andere Parameter.

                    Möchte man jedoch vier Aktionen ausführen, dann steht man doch vor einem Problem?

                    Kommentar


                    • #11
                      Hi,

                      interessantes Thema. Ich streu hier einfach mal meinen aktuellen Ansatz rein.

                      Meine .htaccess - Datei für ein Testprojekt sieht aktuell so aus:
                      Code:
                      RewriteEngine on
                      
                      RewriteBase /admin/PHPFrog2/
                      
                      RewriteRule ^(([a-z0-9_\-\/]+\/)?[a-z0-9_\-]+)\/?$ template.php?href=$1
                      
                      RewriteRule ^(([a-z0-9_\-\/]+\/)?[a-z0-9_\-]+)\/index([0-9]+)\.html$ template.php?href=$1&p=$2
                      Die Adressen treten daraufhin folgendermaßen in Erscheinung:
                      Code:
                      /ordner/ordner2/foo/bar/
                      Wobei beim Aufruf noch nicht klar ist, was in der URL für die Auswahl der einzubindenden Datei zuständig ist und was als Parameter durchgeht.

                      Der Pfad wird also erstmal auseinander genommen und dann wird rekursiv nach einem entsprechenden Datenbankeintrag gesucht, der mir dann wiederum sagt, welche Datei eingebunden wird.

                      Die Funktion zerlegt den Pfad natürlich anhand der / in Einzelteile und schaut sich dann von hinten nach vorne jedes Element an, ob es in der Datenbank vorkommt. Begonnen wird also, die Beispieladresse oben mal angenommen, mit bar.
                      Kommt es zu einer Übereinstimmung, ist aber noch nicht gesagt, dass es sich dabei nicht um einen Parameter handeln kann, denn alle weiteren Elemente (ordner, ordner2 und bar) müssten dann jeweils ein Elternteil des nachfolgenden Elements sein.
                      Sollte also bar kein Parameter sein, müsste es ein Kind von foo sein, welches ein Kind von ordner2 sein müsste und dieses Element müsste wiederum ein Kind von ordner sein.

                      Befinden sich in der Datenbank also nur 3 Einträge wie:
                      Code:
                      id | href    | parentID  | file
                      1  | ordner  | 0         | seite1
                      2  | ordner2 | 1         | seite2
                      3  | foo     | 0         | foo
                      werden die beiden letzten Elemente foo und bar als Parameter betrachtet, denn bar ist erst gar nicht in der Datenbank vorhanden und foo hat keine Eltern.

                      Diese Parameter sind dann gleichzeitig Parametername(-schlüssel) und Wert in einem.

                      Es wird also die Datei seite2.php ausgewählt und eingebunden, da ordner2 in der Datenbank auftaucht und ordner als Elternteil hat.

                      ---------------------------------------------------------------------------------------------

                      Die von Dr. E. verlinkten Informationen zum URL-Schema finde ich auch sehr interessant. Die Form meiner URLs könnte ich wohl noch an die Form
                      Code:
                      /{key1}/{value1}/{key2}/{value2}/
                      anpassen. Dann wäre ein Parameter nicht mehr Schlüssel und Wert in einem. Allerdings kann ich momentan keinen wirklichen Vorteil dadurch erkennen.

                      Was passiert z.B., wenn ein Schlüssel fehlt?
                      Code:
                      /{key1}/{value1}/{value2}/
                      Dann würde der eigentliche Wert als Parameterschlüssel erkannt werden und der Parameter wäre leer. Dies würde aber wohl keinen großen Schaden anrichten!?

                      Zitat von Anyone
                      Möchte man jedoch vier Aktionen ausführen, dann steht man doch vor einem Problem?
                      Hmm, wie meinst du das? Warum kannst du ihn nicht hinter Aktion 3 anhängen?
                      http://hallophp.de

                      Kommentar


                      • #12
                        Also ich schreibe einfach immer fast alles auf die index.php um und erledige den Kram in PHP, da ist man flexibler und hat nicht etliche rules die sich unter umständen irgendwann in die queere kommen (vor allem hässlich zu testen/debuggen)

                        RewriteRule !(robots.txt|favicon.ico)$ index.php

                        in PHP komm ich dann via $_SERVER an den kompletten Pfad und kann damit machen was ich will.
                        robo47.net - Blog, Codeschnipsel und mehr
                        | Caching-Klassen und Opcode Caches in php | Robo47 Components - PHP Library extending Zend Framework

                        Kommentar


                        • #13
                          Ah, danke, hilft mir weiter!

                          Jetzt erscheint es mir plötzlich gar nicht mehr sinnvoll, überhaupt auf ein bestimmtes URL-Schema innerhalb der .htaccess zu prüfen. Das kann ich ja alles in PHP erledigen.
                          http://hallophp.de

                          Kommentar


                          • #14
                            ... meine Rede im Post #2!
                            Viele Grüße,
                            Dr.E.

                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                            1. Think about software design before you start to write code!
                            2. Discuss and review it together with experts!
                            3. Choose good tools (-> Adventure PHP Framework (APF))!
                            4. Write clean and reusable software only!
                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                            Kommentar


                            • #15
                              Hallo,

                              ich hätte noch einen anderen Ansatz. Man trennt sich einfach von dem Directory-Seperator als Abtrennung zwischen den Parametern eines gleichen Typs.

                              www . example . com / Modul / Aktion1_Aktion2_Aktion3_AktionN/andere_Parameter.

                              Nun kann man den Aktionen-String per PHP auswerten und dann danach die Aktionen aufrufen. Und erspart sich "etwas" Arbeit in PHP.

                              Grüße,
                              Simon

                              Kommentar

                              Lädt...
                              X