Ich möchte den idealen Rahmen für ein System sehen, das eine Gruppe von Objekten (dh Benutzer) hat, wobei die Daten in einer Datenbank enthalten sind. Mir wurde geraten, eine Benutzerklasse und eine UserMapper-Klasse zu haben, und das ist mein Verständnis davon, wie es aussehen sollte:
user.class.php
%Vor%main.php
%Vor%Aber das scheint ein bisschen chaotisch in Bezug auf die Main.php Seite. Kann ich nicht ein PDO-Objekt erstellen und dieses in allen meinen Skripten definieren? Sowie ein UserMapper Objekt? Oder jedes Mal, wenn ich einen Benutzer aus der Datenbank holen will, muss ich ein neues userMapper-Objekt erstellen, dann findByUserId (wie oben). Oder gibt es einen einfacheren Weg, dies zu tun?
Wenn ich ein UserGroup-Objekt innerhalb der Klasse User aufrufen möchte, wie würde ich das tun? (Dies müsste auch über PDO mit der Datenbank verbunden werden). Das Folgende scheint chaotisch zu sein:
%Vor%Kann ich kein PDO-Objekt erstellen und dieses in allen meinen definieren? Skripte? Sowie ein UserMapper Objekt?
Das heißt, um die gleiche Instanziierung der gleichen Klassen zu vermeiden, sollten Sie sie vorbereitet haben. Die meisten Leute machen das normalerweise in bootstrap.php
, das "optimiert" alle erforderlichen Abhängigkeiten.
Aber eine Front-Controller-Implementierung enthält auch einen Dispatcher und einen Router. Ich werde nicht tiefer darauf eingehen, sondern mich auf das Problem konzentrieren, das Sie stattdessen zu lösen versuchen.
Es abstrahiert grundsätzlich die Instanziierungslogik. Die Vorteile sind: 1) Sie können die Instanziierung von Objekten verzögern. 2) Sie vermeiden den globalen Zustand, der für das Komponententesten schlecht ist. Die vereinfachte Version würde wie folgt aussehen:
%Vor%Eine sehr vereinfachte Version von bootstrap-er würde aussehen wie,
%Vor%Sie würden einfach in alle Skripte einbeziehen, die auf Benutzer zugreifen müssen
%Vor%Sie müssen stattdessen FETCH_CLASS verwenden, und Sie brauchen keinen userMapper, erweitern Sie einfach PDO und legen Sie dann den rechten Abrufmodus in einer Klasse fest.
Vergessen Sie nicht, die Klassendefinition verfügbar zu machen oder verwenden Sie einen Autoloader
%Vor%FETCH_PROPS_LATE ist da, um den Konstruktor zuerst in Ihrer Klasse abgefeuert zu bekommen. Aber Sie brauchen keinen Konstruktor in Ihrem Fall, also verlieren Sie ihn einfach. Wenn du dich entscheidest, es zu behalten, dann solltest du einen Blick darauf werfen hier zuerst.
Hoffe das hilft viel Glück