2016-08-29 5 views
1

Wie kann ich einige zusätzliche Überprüfung mit dem Ressourcenpaket hinzufügen, um mir die neue Ressource dem aktuellen Benutzer automatisch zuweisen (auch überprüfen, dass sie angemeldet sind) und beim Bearbeiten überprüfen, dass die aktuelle Benutzer besitzt die Ressource?Neue Ressource mit Standardeigentum des aktuellen Benutzers

Ist dies durch Einstellungen möglich oder muss ich jede Aktion im Controller überschreiben?

Ursprünglich hier geschrieben - https://github.com/Sylius/Sylius/issues/5907

Antwort

2

einfach zusammenfassen:

Wie ich Ihnen in 2 Fällen verstanden haben. Zuerst erstellen Sie eine eigene Ressource. Am besten wäre es, eine Standardressourcenfactory zu dekorieren, in die Sie einen UserContext einfügen, um einen aktuell angemeldeten Benutzer zu ermitteln. Oder geben Sie es als zweites Argument an die Factory-Methode weiter.

Zweitens ist eine Ressource zu aktualisieren. Sie möchten die Bearbeitung der Ressource nur einem Eigentümer erlauben? Eine Repository-Methode, die nicht nur die Ressourcen-ID, sondern auch einen aktuellen Benutzer erhält, übernimmt die Aufgabe. Dann hätten Sie eine Methode findByIdAndCustomer, so dass nur der Benutzer auf eine Bearbeitungsseite zugreifen könnte. Andernfalls würde ein Fehler angezeigt werden. Ich denke, es wäre 404.

Wenn dies ist, was Sie wollen, werden Sie am Ende mit zwei überschriebenen Ressourcen (benutzerdefinierte Fabrik und Repository) und Sie müssen Rest in Yaml beim Definieren eines Routing zu behandeln. Es sind keine Controller-Änderungen erforderlich.

Einige Vergleich beider Ansätze:

  1. es mit Hörer auflösen wahrscheinlich schneller wäre (nur eine Klasse erforderlich) und einfacher.
  2. Die Verwaltung durch Ereignis-Listener würde keine Routing-Änderungen erfordern.
  3. Das Überschreiben einer Factory stellt sicher, dass dieses Objekt immer mit dem angegebenen Benutzer erstellt wird. Das Ereignis wird nach der Erstellung ausgelöst, jedoch bevor es in der Datenbank gespeichert wird.
  4. Die benutzerdefinierte Repository-Methode stellt sicher, dass die Bearbeitungsseite nicht einmal von Nichteigentümern angezeigt werden kann.

Beide sind richtig. IMHO ist zuerst schneller, zweiter ist sauberer. Entscheiden Sie einfach, was Sie brauchen

2

Sie Ereignisse, die von der Steuerung für das gebrannte verwenden können. Sehen Sie hier: http://docs.sylius.org/en/latest/bundles/general/events.html

Im Listener sollten Sie den Dienst security.context injizieren, mit dem Sie überprüfen können, ob der Benutzer angemeldet ist oder nicht.

Edit: Bitte werfen Sie einen Blick auf @ Łukasz Antwort, die alternative, ein bisschen sauberere Lösung enthält. ;)

0

Paweł empfiehlt Veranstaltungen, wie ich auch zuerst, aber Łukasz schlug eine Übersteuerung von Fabrik und Lagerstätten vor.

Obwohl ich zustimme, dass beide richtig sind und dem ursprünglichen Poster helfen, sein Ziel zu erreichen, frage ich mich, was die Argumente hinter beiden sind.

Der einzige Zweck dieses Kommentars ist die Debatte über diese beiden Lösungen.

Verwandte Themen