2016-04-08 9 views
0

Nehmen wir an, dass ich zwei Entitätsklassen habe:
\AppBundle\Entity\User - user provider;
\AppBundle\Entity\Article - einfacher Artikel.Symfony 3 - So legen Sie den aktuell angemeldeten Benutzer als Entität "Autor" fest

Die Article Klasse haben auch diese Eigenschaften:
author - angibt, auf Benutzer, die diese besondere Einheit erstellt;
updatedBy - Anzeige auf Benutzer, die in letzter Zeit Inhalt eines bestimmten Artikels aktualisiert.

Wie aktuell angemeldeten Benutzerobjekt Article Einheit passieren bestimmte Werte auf author und/oder updatedBy Eigenschaften auf Back-End von EasyAdminBundle auf Symfony 3.0.1 erzeugt zu setzen?

+0

Warum haben Sie Ihre Frage mit 'symfony2' Tag, wenn es explizit über' symfony3' ist? – cezar

+0

@cezar Noch immer benutzen nur sehr wenige Leute 'symfony3' und Symfony3 unterscheidet sich nicht so sehr von Symfony2.8. –

Antwort

1

Wenn Sie in einem Controller tun Sie nur, dass

$article->setAuthor($this->getUser()); 
$article->setUpdatedBy($this->getUser()); 

Oder

Wenn Sie möchten, dass diese automatische ist

Sie benötigen einen Zuhörer auf Lehre Ereignis zu erklären. In deinem Fall schätze ich auf preUpdate, indem ich den aktuellen Benutzer einschließe.

Es gibt eine sehr schöne Dokumentation http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html

ich hier hier bearbeiten um Ihren Kommentar zu beantworten

Haben Sie sich keine Sorgen, die Benutzereinheit injizieren können, wenn Sie Ihre Zuhörer als Dienst erklären

Zum Beispiel:

services: 
    your_listener: 
     class:  App\AppBundle\Your_Listener 
     arguments: ["@security.token_storage"] 

Ihre Zuhörer:

private $current_user; 

public function __construct($security_context) { 
     if ($security_context->getToken() != null) { 
      $this->current_user = $security_context->getToken()->getUser(); 
     } 
    } 

Jetzt können Sie

tun
$entity= $args->getEntity(); // get your Article 

if (!$entity instanceof Article) { 
     return; 
} 

$entity->setAuthor($this->current_user); 
$entity->setUpdatedBy($this->current_user); 
+0

Ich möchte den 2. Ansatz nehmen. Wie kann ich die aktuelle Benutzerobjektinstanz in meine Listener-Klasse aufnehmen? –

+0

Schauen Sie in der Dokumentation Sie benötigen dies als Parameter: LifecycleEventArgs $ Args, um die Benutzereinheit wie folgt zu erhalten: $ entity = $ args-> getEntity(); Hier im Dokument: http: // symfony.com/doc/current/cookbook/document/event_listeners_subscribers.html # creating-the-listener-class Hoffe, das ist kann Ihnen helfen –

+0

Ja, aber wenn ich 'Artikel' Entität aktualisieren, werde ich diese Klasse Instanz in '$ args-> getEntity();' und kein Benutzer. Ich möchte den aktuell angemeldeten Benutzer als Autor dieser bestimmten Entität festlegen. –

0

Wenn Sie Beziehungen zu Autor Einheit haben

$em = $this->getDoctrine()->getManager(); 
$user = new User(); 
$user->setAuthor($this->getUser()); 
$em->persist($user); 
$em->flush(); 

auf Controller, aber das ist keine gute Idee. Verwenden Sie Befehl oder ein anderes Entwurfsmuster.

+0

Die Entität 'Article' hat die Methode' setAuthor', nicht die Entität 'User'. Du hast einige Dinge gemischt. – cezar

+0

Sorry, aber dieses Beispiel, wie Sie den aktuellen Benutzer als Artikelautor speichern können. – M4ver