2015-05-05 15 views
7

ktoś może dostarczyć kompletny przykład rozszerzenia Blameable Gedmo, a zwłaszcza konfiguracja Blameable Listener?Konfiguracja blameable przedłużenie doktryna z Symfony2

Używam kod podany w dokumentacji:

* @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; 

ALE kolumny bazy danych createdBy i UpdatedBy są zawsze NULL.

Dokumentacja stanowi przykład aby skonfigurować inne detektory (np timestampable który dostałem pracę), ale nie mogę znaleźć przykład lub dokumentacją blameable słuchacza.

Dzięki za pomoc !!

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

EDIT odpowiedzieć Jean:

tak dodałem użytku, który jest:

use Gedmo\Mapping\Annotation as Gedmo; 

Używam również Timestampable z podaną cechą:

use Gedmo\Timestampable\Traits\TimestampableEntity; 

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

i konfiguracja timestampable on jest:

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

Timespambable działa dobrze. Próbowałem podobną konfigurację blameable słuchacza ponieważ ma setUserValue metody:

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

ale to nie działa, mam ten błąd (na 4 zestawy są te używane w moim projekcie):

Klasa "Symfony \ Komponent \ Bezpieczeństwo \ Klucz \ Uwierzytelnianie \ Token \ Pamięć masowa \ TokenStorage" nie została znaleziona w skonfigurowanych przestrzeniach nazw Cf \ UserBundle \ Entity, Cf \ DocumentBundle \ Entity, Cf \ SouffleBundle \ Entity, FOS \ UserBundle \ model

rozumiem, że brakuje identyfikatora użytkownika lub token jako argument w jednym w Tak czy inaczej, ale po prostu nie mogę znaleźć przykładu nigdzie. To tam utknąłem. Dowolny pomysł ?

+0

Czy można umieścić 'use' na szczycie swojej klasy? Czy możesz nam to pokazać? – Jean

+0

Ponadto, Blameable działa tylko wtedy, gdy encja jest tworzona \ aktualizowana z kontekstem zabezpieczeń i zawierającym token użytkownika, który jest brany pod uwagę i trwa w polu. – Jean

+0

Czy używasz [https://github.com/stof/StofDoctrineExtensionsBundle](https://github.com/stof/StofDoctrineExtensionsBundle)? Mam to i dziełami godnymi potępienia. – kba

Odpowiedz

10

Zauważyłem również, że trudno jest włączyć zachowanie Blameable z StofDoctrineExtensionsBundle (załóżmy, że go używasz).

Jest jeden kawałek konfiguracji, która nie jest wymieniona w tym zestawie:

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

Oprócz tego, stworzyłem cechę BlameableEntity:

<?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; 
    } 

} 

A w swojej jednostce, wystarczy dodać use Oświadczenie takie jak to:

<?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; 

    // ... 

Mam nadzieję, że to pomoże!

2

mały dodatkowy wkład dla osób, które włącza się symfony 3.0 +:

W "doctrine_extensions.yml" dodać/zmodyfikować:

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

Jeśli ktoś jeszcze ma ten problem, mogę wreszcie Gedmo Blameable robocze następujące kroki:

  1. Śledź ten przewodnika https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/symfony2.md
  2. Dodaj to do doctrine_extensions.yml

    gedmo.listener.blameable: 
        class: Gedmo\Blameable\BlameableListener 
        tags: 
        - { name: doctrine.event_subscriber, connection: default } 
        calls: 
        - [ setAnnotationReader, [ "@annotation_reader" ] ] 
    
  3. zmodyfikować metodę onKernelRequest następujące:

    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()); 
         } 
        } 
    }