2015-05-05 10 views
7

kann jemand ein komplettes Beispiel für die Blameable Gedmo Erweiterung und vor allem die Konfiguration des Blameable Listener?Konfiguration schuldige Doktrin Erweiterung mit Symfony2

Ich bin mit dem Code, der von der Dokumentation:

* @var User $createdBy 
* 
* @Gedmo\Blameable(on="create") 
* @ORM\ManyToOne(targetEntity="Cf\UserBundle\Entity\User") 
* @ORM\JoinColumn(name="createdBy", referencedColumnName="id") 
*/ 
private $createdBy; 

/** 
* @var User $updatedBy 
* 
* @Gedmo\Blameable(on="update") 
* @ORM\ManyToOne(targetEntity="Cf\UserBundle\Entity\User") 
* @ORM\JoinColumn(name="updatedBy", referencedColumnName="id") 
*/ 
private $updatedBy; 

aber die createdBy und updatedBy Datenbankspalten sind immer NULL.

Die Dokumentation bietet ein Beispiel zum Konfigurieren der anderen Listener (z. B. Zeitstempel, die ich funktionierte), aber ich finde kein Beispiel oder Dokumentation für die tadellose Listener.

Danke für jede Hilfe !!

============================================== =================

EDIT Jean zu beantworten:

ja ich hinzugefügt, um die Nutzung, die ist:

use Gedmo\Mapping\Annotation as Gedmo; 

ich benutze auch die Timestampable mit dem angegebenen Merkmal:

use Gedmo\Timestampable\Traits\TimestampableEntity; 

// doctrine comments removed 
class Document 
{ 
    use TimestampableEntity; 
... 
} 

und die Zeitstempel konfiguration auf ist:

services: 
    gedmo.listener.timestampable: 
     class: Gedmo\Timestampable\TimestampableListener 
     tags: 
      - { name: doctrine.event_subscriber, connection: default } 
     calls: 
      - [ setAnnotationReader, [ @annotation_reader ] ] 

Zeitspray funktioniert gut. Ich habe versucht, eine ähnliche Konfiguration für die tadelnswert Zuhörer, da sie eine setUserValue Methode hat:

gedmo.listener.blameable: 
    class: Gedmo\Blameable\BlameableListener 
    tags: 
     - { name: doctrine.event_subscriber, connection: default } 
    calls: 
     - [ setAnnotationReader, [ @annotation_reader ] ] 
     - [ setUserValue, [ @security.token_storage ] ] 

aber es funktioniert nicht, ich diesen Fehler (die 4-Bundles sind diejenigen, die in meinem Projekt verwendet wird):

Die Klasse 'Symfony \ Component \ Sicherheit \ Core \ Authentication \ Token \ Storage \ TokenStorage' wurde nicht in den konfigurierten Namespaces Cf \ UserBundle \ Entity, Cf \ DocumentBundle \ Entity, Cf \ SouffleBundle \ Entity, FOS \ UserBundle gefunden \ Modell

Ich verstehe, dass die Benutzer-ID oder das Sicherheitstoken als Argument in einem w fehlt Ja oder anders, aber ich kann nirgends ein Beispiel finden. Da stecke ich fest. Irgendeine Idee ?

+0

Haben Sie den 'use' auf Ihre Klasse setzen? Kannst du uns das zeigen? – Jean

+0

Darüber hinaus funktioniert Blameable nur, wenn die Entität mit dem Sicherheitskontext auf einem Benutzer-Token erstellt und aktualisiert wird, das ein Benutzer-Token enthält, das in Ihrem Feld berücksichtigt und beibehalten wird. – Jean

+0

Verwenden Sie [https://github.com/stof/StofDoctrineExtensionsBundle](https://github.com/stof/StofDoctrineExtensionsBundle)? Ich habe es und tadelige Werke. – kba

Antwort

10

Ich fand es auch schwierig, ein fehlerhaftes Verhalten mit StofDoctrineExtensionsBundle zu aktivieren (nehmen wir an, Sie verwenden es).

Es ist ein Stück Konfiguration, die nicht in diesem Paket erwähnt wird:

# Add in your app/config/config.yml 
stof_doctrine_extensions: 
    orm: 
     default: 
      blameable: true 

Davon abgesehen, habe ich ein BlameableEntity Merkmal:

<?php 

namespace AppBundle\Entity\Traits; 

use Doctrine\ORM\Mapping as ORM; 
use Gedmo\Mapping\Annotation as Gedmo; 
use AppBundle\Entity\User; 

/** 
* Add Blameable behavior to an entity. 
*/ 
trait BlameableEntity { 

    /** 
    * @var User 
    * 
    * @Gedmo\Blameable(on="create") 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User") 
    * @ORM\JoinColumn(name="created_by", referencedColumnName="id") 
    */ 
    protected $createdBy; 

    /** 
    * @var User 
    * 
    * @Gedmo\Blameable(on="update") 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User") 
    * @ORM\JoinColumn(name="updated_by", referencedColumnName="id") 
    */ 
    protected $updatedBy; 

    /** 
    * Set createdBy 
    * 
    * @param User $createdBy 
    * @return Object 
    */ 
    public function setCreatedBy(User $createdBy) 
    { 
     $this->createdBy = $createdBy; 

     return $this; 
    } 

    /** 
    * Get createdBy 
    * 
    * @return User 
    */ 
    public function getCreatedBy() 
    { 
     return $this->createdBy; 
    } 

    /** 
    * Set updatedBy 
    * 
    * @param User $updatedBy 
    * @return Object 
    */ 
    public function setUpdatedBy(User $updatedBy) 
    { 
     $this->updatedBy = $updatedBy; 

     return $this; 
    } 

    /** 
    * Get updatedBy 
    * 
    * @return User 
    */ 
    public function getUpdatedBy() 
    { 
     return $this->updatedBy; 
    } 

} 

Und in Ihrem Unternehmen, fügen Sie einfach eine use Anweisung wie folgt:

<?php 

namespace AppBundle\Entity; 

use AppBundle\Entity\Traits\BlameableEntity; 
use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* Your precious Foo entity 
* 
* @ORM\Table(name="foo") 
* @ORM\Entity(repositoryClass="AppBundle\Entity\FooRepository") 
*/ 
class Foo 
{ 
    use BlameableEntity; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    // ... 

Ich hoffe, das hilft!

2

der kleine zusätzliche Beitrag für Leute, die Symfony einschalten 3.0 +:

In "doctrine_extensions.yml" hinzufügen/ändern:

gedmo.listener.blameable: 
    class: Gedmo\Blameable\BlameableListener 
    tags: 
     - { name: doctrine.event_subscriber, connection: default } 
    calls: 
     - [ setAnnotationReader, [ "@annotation_reader" ] ] 
-1

Wenn jemand noch dieses Problem hat, kann ich endlich Gedmo tadelnswert arbeiten die folgenden Schritte erhalten:

  1. Folgen dieser Guides https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/symfony2.md
  2. Fügen Sie diese auf doctrine_extensions.yml

    gedmo.listener.blameable: 
        class: Gedmo\Blameable\BlameableListener 
        tags: 
        - { name: doctrine.event_subscriber, connection: default } 
        calls: 
        - [ setAnnotationReader, [ "@annotation_reader" ] ] 
    
  3. die onKernelRequest Methode wie folgt ändern:

    public function onKernelRequest(GetResponseEvent $event) { 
        if (Kernel::MAJOR_VERSION == 2 && Kernel::MINOR_VERSION < 6) { 
         $securityContext = $this->container->get('security.context', ContainerInterface::NULL_ON_INVALID_REFERENCE); 
         if (null !== $securityContext && null !== $securityContext->getToken() && $securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) { 
          $loggable = $this->container->get('gedmo.listener.loggable'); 
          $loggable->setUsername($securityContext->getToken()->getUsername()); 
         } 
        } 
        else { 
         $tokenStorage = $this->container->get('security.token_storage')->getToken(); 
         $authorizationChecker = $this->container->get('security.authorization_checker'); 
         if (null !== $tokenStorage && $authorizationChecker->isGranted('IS_AUTHENTICATED_REMEMBERED')) { 
          $loggable = $this->container->get('gedmo.listener.loggable'); 
          $loggable->setUsername($tokenStorage->getUser()); 
          $blameable = $this->container->get('gedmo.listener.blameable'); 
          $blameable->setUserValue($tokenStorage->getUser()); 
         } 
        } 
    } 
    
Verwandte Themen