2016-04-30 3 views
1

Angenommen, wir haben zwei Modelle: Users und Posts. In diesen Modellen ist eine Viele-zu-Viele-Beziehung definiert - Ein Benutzer kann viele Beiträge haben, und Post kann viele Editoren (Benutzer) haben.Gibt es eine Möglichkeit, einen Job an eine andere Aktion in Laravel zu delegieren?

Wenn diese Form PostsController vorgelegt wird, dann ist es storeAktion muss die neue Post Felder nicht nur behandeln, aber es ist auch Herausgeber, was falsch zu sein scheint. Beispiel:

enter image description here

public function store() 
{ 
    // creating a post 
    $post = Post::create(request()->get('post_fields')); 

    // adding editors to the post (this should be done somewhere else) 
    $editors = request()->get('editors'); 
    foreach($editors as $editor){ 
     $post->editors()->attach($editor->id); 
    } 

    return redirect('/'); 
} 

Wie ich bereits erwähnt, scheint dieser Ansatz falsch und ungeschickt zu mir. Aus diesem Grund möchte ich Delegat Editoren behandeln Aufgabe PostsEditorsController, die eine separate Controller nur für posts-editors Relationship Management gewidmet sein wird. So wird die store nun wie folgt aussehen:

public function store() 
{ 
    // creating a post 
    $post = Post::create(request()->get('post_fields')); 

    $editors = request()->get('editors'); 
    PostsEditorsController::doSomething($post, $editors); // <-- just to show what I want to achieve 

    return redirect('/'); 
} 

Wie kann ich das tun?

Antwort

1

Wie wäre es, diese Logik den Speicherereignissen des Post-Modells hinzuzufügen?

https://laravel.com/docs/5.2/eloquent#events

Auf diese Weise werden diese Logik jederzeit rufen das Modell gespeichert ist, können Sie die Aufregung der sich Gedanken über das Speichern halten Sie es, wenn Sie mit der Bearbeitung anderswo im System hinzufügen synchronisiert.

+0

Das ist ein guter Weg, um dieses Problem zu lösen, aber ich denke, dass die Verwendung von Controllern für diese Arbeit natürlicher ist. Was würden Sie in anderen Frameworks tun, in denen Ereignisse nicht verfügbar sind? Korrigiere mich, wenn ich falsch liege. –

+0

Sie haben recht, dass es ein bisschen peinlich sein kann, Controller-Daten mit Ereignissen zu behandeln, aber zu versuchen, dies weiter zu vereinfachen, würde ein bisschen lächerlich werden. Sie können dies leicht in einer Zeile zusammenfassen, indem Sie '$ post-> sync ('editors', $ editors> pluck ('id'));', IIRC. Das ist eine Zeile - es wird nicht einfacher. – Josh

+0

Die Frage ist mehr über ** wo ** sollte es getan werden, anstatt ** wie **. Also, muss '$ post-> sync ('editors', $ editors-> pluck ('id'));' in 'store' Aktion bleiben, oder sollte es woanders hingehen? Wenn wir mehr "Nebensachen" in der "Store" -Methode hätten, die nur die Post-Daten speichern soll, würde es sehr groß werden. Entschuldigung, wenn ich nicht klar genug bin. –

Verwandte Themen