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

Beitrag lesen

Hallo borisbaer,

ein Router ist generell eine Komponente, die einen HTTP Request auf ein Stück Code abbildet, die den Request bearbeiten soll. Und sie sollte das HTTP Geschäft möglichst von den Controllern fernhalten.

Ich empfehle daher, die Methode in der Routendeklaration unterzubringen, d.h. du hast unterschiedliche Routendeklarationen für GET und POST.

Die Frage ist dann, wie man für GET und POST auf die ansonsten gleiche URL eine andere Methode hinterlegt. Dazu könnte man in der Route außer dem URL-Pattern auch noch Regeln geben, wie den Routendaten der Klassen- und Methodenname zu gewinnen ist. Im einfachsten Fall durch ein Pattern:

$router->route("/admin/{controller}/{action}/{id}", [
   "requestmethod" => "GET",
   "controllername" => "admin/{controller}Controller",
   "functionname" => "get_{action}"
]). 

Hier würde für den Controller noch ein Namespace gesetzt und dem Namen der aufzurufenden Funktion ein get_ vorangestellt.

Aber schau Dir auch mal die Code-Attribute an, die ab PHP 8 verfügbar sind. Damit kannst Du in einem Controller Zusatzinformationen hinterlegen, die besagen, für welche Werte in den Routendaten eine Methode relevant ist. Für ein Posting hier ist mir das zu viel.

Code-Attribute.

Deine Controllerklasse könnte dann so aussehen:

class UserController 
{
   #[Route(action:"edit", method:"get")]
   public function get_edit($id) {
   }
   #[Route(action:"edit", method:"post")]
   public function post_edit($id) {
   }
}

Mit Hilfe von Reflection kann der Router erkennen, dass die aufzurufende Methode einen Parameter $id hat, die Routendaten eine id enthalten und sie gleich übergeben. Ist nicht trivial, aber machbar.

Rolf

--
sumpsi - posui - obstruxi