2016-09-17 2 views
1

Angenommen, wir haben Modelle A und B und wir müssen wählen, welche von ihnen zu Instanziieren basierend auf den Informationen aus der Sicht.Ist es eine gute Übung, ein Modell auf der Grundlage des Modellklassennamens nach POST zu wählen?

Wäre es eine gute Übung sein, so etwas zu tun:

// ... 
$this->validate($request, [ 
    'model.class_name' => 'in:A,B' // restrict users to only pass either 'A' or 'B' as class_name 
]) 

$data  = $request()->get('model'); // <-- contains: $data['id'] and $data['class_name'] 

$id   = $data['id']; 
$class_name = $data['class_name']; 

$$class_name::find($id); // <-- notice, that we are using POST-ed 'class_name' to determine which model we want to use! 
// ... 

Oder kann dieser Ansatz einige Probleme in der Zukunft vorstellen?

+0

Es ist sehr schlecht, jede Art von Benutzereingaben zu verwenden, ohne es zu validieren. Was passiert, wenn jemand einen Klassennamen einsendet, der nicht zugänglich sein sollte? Sie sollten einen Controller haben, der die Anfrage überprüft, validiert und das geeignete Modell auswählt. –

+0

@MagnusEriksson Ja natürlich. Ich habe nur vergessen, Validierungen in das Snippet aufzunehmen. Danke, dass du darauf hingewiesen hast. Gibt es außer der Validierung des 'class_name' weitere Probleme? –

+0

Ich würde den Klassennamen nicht in meine Ansicht einfügen, ich würde es in meinen Controller setzen und einfach die Ansicht etwas wie 1, 2, 3 usw. senden lassen ... dann können Sie die gleiche Ansicht in verschiedenen Controllern verwenden, die sie übersetzt anders, und Sie müssen nur den Controller ändern, wenn Sie einen Modellnamen austauschen müssen. Und Sie geben Ihre Klassennamen den Benutzern nicht bekannt .... aber das ist nur meine Meinung ... –

Antwort

0

Antwort ist Nein.

Grund:

Was passiert, wenn Ihr Modell A andere Funktionalität als B hat?

In diesem Fall, dass Sie zusätzliche Kontrollen hinzufügen müssen, die anrufen müssen funktionieren, wenn A gegeben ist und was passiert, wenn B und so on.Also, wenn Sie denken, dass Sie denselben Satz von Funktionen haben, sollten Sie Repository Pattern verwenden, für laravel siehe this, dies wird Ihnen helfen, Ihr System skalierbarer, flexibler und wartbarer zu machen.

Es ist gut zu wissen, welche komplette Anforderung und entsprechend Code tun.

Hoffnung das wird Ihnen helfen :)

+0

Vielen Dank, das ist ein sehr guter Punkt. Was ist mit Binden "A" und "B" mit dem gleichen Vertrag? Auf diese Weise wird das API-Problem gelöst. –

+1

Repository-Muster ist es tatsächlich auf Vertrag basiert, also was Sie denken, ist bereits mit diesem Muster vorgeschlagen. –

Verwandte Themen