Rolf B: Was gibt es beim Schreiben eines PHP-Routers zu beachten?

Beitrag lesen

Hallo borisbaer,

Variable Routen habe ich bei dem Versuch mit den Attributen der Einfachheit halber erst mal nicht berücksichtig.

Das geht mit Attributen auch schlecht.

Also soll ich im Vorfeld angeben, auf welchen Controller und welchen Action-Namen ich es mit dieser Route abgesehen habe?

Nein, nein.

Bei variablen Routen ist doch gerade der Clou, dass man vorher nicht wissen muss, was der Router finden soll.

Ja. Deswegen sind sie für einen brauchbaren Router auch nötig. Ein Router verarbeitet URL-Muster und leitet daraus Suchbegriffe ab. Mit diesen Suchbegriffen findet er eine Klasse und eine Methode darin, die die URL verarbeitet. Suchbegriffe, die DU auf diese Weise finden kannst, sind der Controller, die Aktion und auch das HTTP Verb (also GET, POST oder PUT - ich nenne das jetzt mal bewusst nicht Methode, um es von dem OOP-Begriff "Methode" zu trennen).

Die Idee, dass man in der URL direkt den Klassennamen und den Methodennamen findet, ist eine von vielen Möglichkeiten, und viele Router sind auch so implementiert.

Aber Du merkst ja, dass Du damit an Grenzen stößt, wenn Du ein REST System baust, da hat die gleiche URL mit unterschiedlichen HTTP Verben unterschiedliche Bedeutungen. Auch bei Formularen hast Du mit GET und POST das Problem.

Die Controllersuche wird komplizierter, wenn deine URLs nicht alle dem gleichen Schema folgen. Wenn Du eine URL /user/profile/47 und eine URL /admin/user/delete/47 unterstützen willst, dann wird das sehr wahrscheinlich nicht der gleiche Controller sein. Wahrscheinlich definierst Du zwei verschiedene Routen dafür, und eine von beiden kann nicht stumpf den Controllernamen aus der URL holen, sondern muss etwas hinzufügen. Deswegen hatte ich vorgestern die Patterns vorgeschlagen, um auf einfacher Weise die gefundenen Namensteile in die passenden Platzhalter einzusetzen. Aber das ist nur eine Idee.

Bei der Abbildung der Aktion auf die Methode kommt dann das von Dir genannte Problem dazu, das HTTP Verb mit einzubeziehen. Die Action-Attribute an den Methoden könnten angeben, für welche Kombination aus HTTP Verb und Aktionsname diese Methode vorgesehen ist.

Moment, für mich waren Actions ein Sammelbegriff für eine Klasse plus die jeweilige Methode.

Nee, eigentlich ein Schritt vorher. Der HTTP Request beinhaltet ein HTTP Verb und die URL. Aus der URL bekommst Du einen Controller und eine gewünschte Aktion. Der Controller wird zur Klasse, und aus HTTP Verb und Aktion musst Du herleiten, welche Methode aufzurufen ist. Diese Methode implementiert dann die Aktion für dieses Verb.

Momentan habe ich eine Klasse, die provisorisch ebenfalls Router heißt

Whoa - dann hast Du mich damit verwirrt. Ein Attribut sollte seinen Namen nicht davon ableiten, für wen es gemacht ist, sondern welche Eigenschaft es dem attributierten Dings zuschreiben will.

Dann werde ich deiner Empfehlung folgen.

Oder deiner Nase. Je nachdem, was Dir besser gefällt 😀 👃

Rolf

--
sumpsi - posui - obstruxi