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 store
Aktion muss die neue Post Felder nicht nur behandeln, aber es ist auch Herausgeber, was falsch zu sein scheint. Beispiel:
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?
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. –
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
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. –