2016-07-30 8 views
6

Ich benutze Laravel, aber es ist nicht wichtig, wenn Sie einen Controller mit Laravel-Befehlszeilen-Tool erstellen, legt es 4 Standardfunktion zum Erstellen und Aktualisieren dort.Ist es eine schlechte Übung, die gleiche Methode für SAVE und UPDATE zu verwenden?

create und store für save

edit und update für gut update!

Dies ist, was Laravel für Shop-Controller vorschlagen.

class ShopController extends Controller 
{ 

    public function create() 
    { 
     // return create view 
    } 

    public function store(Request $request) 
    { 
     // save a shop 
    } 

    public function edit($id) 
    { 
     // find a shop , return edit view 
    } 

    public function update(Request $request, $id) 
    { 
     // find the shop with id , update the shop 
    } 

} 

Aber Ich mag die gleichen Methoden verwenden, Ansicht und Speicherung für das Zeigen/meine Zeile aktualisieren und vermeiden viele zusätzliche Code zu schreiben.

class ShopController extends Controller 
{ 

    public function create($id = 0) 
    { 
     return view('shop-create' , ['edit'=> Shop::find($id)]); 
    } 

    public function store(Request $request , $id = 0) 
    { 
     $whitelist = [ 
      'title'=>'required', 
      'phone'=>'present|numeric' , 
      'address'=>'present' , 
     ]; 
     $this->validate($request, $whitelist); 
     $shop = Shop::findOrNew($id) ; 
     // find a shop with given id or create a new shop instance 
     foreach($whitelist as $k=>$v) 
     $shop->$k = $request[$k]; 

     $shop->save(); 
    } 

} 

Natürlich gehe ich mit dem, was Ich mag (zweite Option), aber da Laravel schlägt die erste Art und Weise, nur aus Neugier gibt es keinen Grund, warum ich es so nicht tun sollte? Wird dies in irgendeiner Weise als schlechte Praxis angesehen?

+0

zeigen Sie Ihre Ansicht Quellcode. –

+0

Es ist besser, nicht gegen die Konventionen des Frameworks zu kämpfen, es wird Sie und andere wahrscheinlich in Zukunft verwirren. Umfassen Sie die Art und Weise, wie Laravel arbeitet, und Sie werden mit leichter zu befolgenden Dokumentationen belohnt und es wird einfacher sein, die Framework-Funktionen zu nutzen. – ShaunUK

Antwort

2

Nichts falsch, aber Sie Code wird schwieriger sein, IMHO zu verstehen.

z.B.:

  • Was macht diese Methode? Es heißt create, aber es auch bearbeiten?
  • Die Ansicht heißt shop-create, aber es bearbeitet auch?
  • Übergeben Sie einen 0 Parameter als Standard für die ID und versuchen Sie find es jedes Mal unnötig ist.

public function create($id = 0) 
{ 
    return view('shop-create' , ['edit'=> Shop::find($id)]); 
} 

Obwohl Sie denken, dass Sie Ihren Code vereinfachen, drehen Sie es komplizierter, da Sie die Single Responsability principile von SOLID sind Maklergeschäft.

Es ist am einfachsten zu verstehen, wenn Sie etwas wie den Laravel-Vorschlag haben.

Auch Sie behalten ein sehr häufiges Muster bei, das jeder Laravel-Entwickler verstehen wird. Sie können also jemanden einstellen, der sich um Ihren Code kümmert, und sich keine Sorgen machen, wenn er es versteht.

+1

thanx, ich kann immer Methoden/Ansichten umbenennen und 'finden', wenn' id' größer als 0 ist ... aber ich verstehe Ihren Punkt und Sie haben Recht, ich werde mit separaten Methoden gehen – max

3

Es ist nichts falsch daran, es auf Ihre Weise zu tun. Die "Laravel" -Weise, die Sie erwähnen, ist, wenn Sie eine Restful resource controller erstellen und ist einfach eine Möglichkeit, damit umzugehen.

Ich denke, diese Controller-Methoden wurden ausgewählt, weil sie gut zu einer "erholsamen" Art von Controller ausgerichtet sind. Wenn Sie eine echte Ruhe-API bauen würden, dann wird die Art und Weise, wie Sie es tun, vom Standpunkt des Standards aus gesehen viel strenger (nicht durch Laravel auferlegt, sondern besser auf den Laravel-Weg ausgerichtet).

Wenn Sie keine öffentlich zugänglichen api, oder etwas zu schaffen, die von externen Einheiten verbraucht werden wird, dann sage ich Ihre Controller entwerfen, die am besten für Sie und Ihr Team

1

gleiche Funktion verwenden für speichern() und update() ist eine gute Idee, aber gleichzeitig wird es die Komplexität erhöhen. Ein Punkt ist, Wenn Sie in Zukunft alles ändern wollen, müssen Sie es nur an einer Stelle ändern. Aber zur gleichen Zeit müssen Sie etwas besondere Vorsicht walten lassen.

Als Ihre Funktion sollte dynamischer sein.

1) Mehrfache Datensätze manipulieren: Sie müssen möglicherweise mehr als ein Raws zur gleichen Zeit aktualisieren, so dass Ihre Funktion flexibel genug sein sollte, um einzelne/mehrere Werte durch die gleiche Funktion einzufügen/zu aktualisieren. Das heißt, einzelne Abfragen sollten in beiden Fällen für mehrere Datensätze ausgelöst werden.

2) Validierung, wenn der Wert bereits vorhanden ist: Wenn Sie eine Validierung überprüfen gehen ... in Einsatz Fall, dass Sie nur überprüfen müssen, ob der Wert in db vorhanden ist oder nicht, wenn im Update-Fall, dass Sie zu überprüfen mit Ausschluss der aktuellen ID z

für Einsatz Fall

$this->validate($request, [ 
     'email' => 'required|string|email|unique:tablename,email' 
    ]); 

für Update Fall

$this->validate($request, [ 
     'email' => 'required|string|email|unique:tablename,email,'.$id.',id' 
    ]); 

Und endlich sehr kleinen Punkt brauchen, aber in Betracht gezogen werden ..

3) Erfolgsmeldung: Zum Zeitpunkt der Einführung Meldung „erfolgreich hinzugefügt“ und

bei updation Zeit Record „erfolgreich aktualisiert“ werden sollte
0

ich diese Methode in einem letzten Projekt von mir, genannt wir die store() und update() Funktion manage() statt und hatten ein getManage(), die die gleiche Ansicht zum Erstellen und Bearbeiten verwenden würden. Ich habe diese Methode sehr gemocht, bin aber auf einige Dinge gestoßen, die es wert waren, erwähnt zu werden. Leider sind die Nachteile outway die Profis, wenn Sie jemals diese Fragen stellen müssen :(

Vorteile:.

  • Kleinere Code - Nicht mehr müssen Sie doppelte Zeilen Code haben in Ihrer store() und update() Funktion
  • Schneller wiederverwenden mit Basismodelle - ctrl+cctrl+vctrl+fctrl+r, wenn Sie wissen, was ich meine
  • einfacher hinzufügen/ändern Eingabewerte -. Ein Mehrwert bedeuten würde nicht havin g, um store() und update() zu ändern, um sicherzustellen, dass beide den zusätzlichen Eingang nutzen.
  • Eine Funktion, um alle zu regeln - Solange Sie nichts Besonderes machen, können Sie sogar eine Funktion für alles definieren. Müssen Sie etwas ändern? Du hast eine Funktion, keine Sorgen.

Nachteile:

  • -Code ist schwieriger für andere (oder eine ältere Ihnen) zu verstehen - Wenn jemand auf diese Methode neu ist oder es eine Weile nicht verwendet wird, zu verstehen, was passiert, Innerhalb deiner Funktion ist es etwas schwieriger als zwei separate zu haben.
  • Validierung ist ein Ärgernis - Wie in this answer angegeben, kann die Validierung für die Erstellung und Aktualisierung unterschiedlich sein. Das bedeutet, dass Sie manchmal zwei Validierungen schreiben müssen, die schließlich zu unordentlichem Code führen, und das wollen wir nicht!
  • Werteinfügung war nicht so cool wie ich dachte - Wenn Sie das gleiche vordefinierte Array verwenden möchten, um zu erstellen oder zu aktualisieren, können Sie auf das Problem stoßen, Werte in create einzufügen, aber nie aktualisieren möchten. Dies führte schließlich entweder zu hässlichen if Anweisungen oder zwei vordefinierten Arrays.

Schließlich ist es an dem, was Sie machen werden und was Sie tun möchten. Wenn Sie eine grundlegende Website haben, die Blogposts und -seiten verwaltet, dann müssen Sie sich keine Sorgen um eine gemeinsame store() und update() Funktion machen. Wenn Sie jedoch ein riesiges CMS mit vielen Modellen, Relationen und verschiedenen Eingabewerten erstellen und aktualisieren (was unterschiedliche Validierungen bedeuten kann), dann würde ich mit dem gehen, was Laravel empfiehlt. Es wäre viel einfacher auf lange Sicht zu halten und Sie werden nicht mit Kopfschmerzen, Hacky Fixes und unreinem Code zu tun haben.

Was auch immer Sie tun, tun Sie nicht beide in verschiedenen Controllern! Das wäre verwirrend.

Übrigens, wenn Sie sich fragen, welche Art von Projekt ich hatte - es war ein riesiges CMS. Obwohl es in einigen Fällen sehr nützlich und einfach war, war es das leider nicht wert.

+0

thanx, sehr aufschlussreich ... im Schreiben einer Group Buying Website für einen Kunden ... es ist nicht klein, aber es ist ziemlich einfach und es gibt nichts Komplexes zumindest in den CRUD-Methoden, aber ich denke, ich werde mit separaten Methoden gehen – max

+0

@max keine Sorgen.Es kann in diesem Fall am besten sein, bei dem zu bleiben, was Laravel sieht, da es für andere einfacher ist, Fehler zu beheben, wenn Sie nicht selbst herausfinden können, was falsch ist. Es ist eine Schande, dass es auf diese Weise manchmal langweilig ist und sich vielleicht anfühlt, als würde man das Gleiche zweimal tippen. Aber auf lange Sicht ist es lohnenswert, gelangweilt zu sein, als Kopfschmerzen zu haben: P –

0

Nichts ist falsch, aber in diesem Fall müssen Sie korrekte Kommentare pflegen, die angeben, dass Ihre Funktion add/edit ausführen und dafür eine Variable wie $ id oder etwas anderes verwenden. Wenn es verfügbar ist, können Sie den Datensatz aktualisieren, andernfalls fügen Sie ihn ein.

0

Dies ist, wie ich es normalerweise tue, auf diese Weise können Sie immer noch unterschiedliche Validierung mit den Anfragen und es ist immer noch klar (imo) was die Funktionen tun.

public function store(AdminPartnerRequest $request) 
{ 
    return $this->handleCreateOrUpdate($request); 
} 

public function update(AdminPartnerRequest $request, $id) 
{ 
    return $this->handleCreateOrUpdate($request,true, $id); 
} 


private function handleCreateOrUpdate($request, $edit = false, $id = null) 
{ 
    if ($edit){ 
     $partner = Partner::find($id); 
    } else{ 
     $partner = new Partner(); 
    } 

     $partner->name = $request->input('name'); 
     $partner->picture = $request->input('image');   
     $partner->save(); 

     return \Redirect::route('admin.partners.index'); 
} 
0

Kleines Projekt, mach was du willst. Gehe mit anderen Entwicklern groß und folge den Konventionen.

Kodierung Konventionen sind eine Reihe von Richtlinien für eine bestimmte Programmiersprache, die Programmierstil, Praktiken und Methoden für jeden Aspekt eines in dieser Sprache geschriebenen Programms empfehlen. Diese Konventionen umfassen normalerweise Dateiorganisation, Einrückung, Kommentare, Deklarationen, Anweisungen, Leerraum, Namenskonventionen, Programmierpraktiken, Programmierprinzipien, Programmierregeln, Best Practices für Architektur usw. Dies sind Richtlinien für die strukturelle Qualität von Software. Software-Programmierern wird dringend empfohlen, diese Richtlinien zu befolgen, um die Lesbarkeit ihres Quellcodes zu verbessern und die Softwarewartung zu vereinfachen. Codierungskonventionen gelten nur für die menschlichen Betreuer und Peer-Reviewer eines Softwareprojekts. Konventionen können in einem dokumentierten Satz von Regeln formalisiert werden, dem ein ganzes Team oder Unternehmen folgt, oder sie können so informell sein wie die üblichen Kodierungspraktiken eines Individuums. Codierungskonventionen werden von Compilern nicht erzwungen. - https://en.wikipedia.org/wiki/Coding_conventions

Verwandte Themen