2015-05-05 19 views
7

bất kỳ ai cũng có thể cung cấp ví dụ hoàn chỉnh về tiện ích mở rộng Gedmo Blameable và đặc biệt là cấu hình của Trình nghe Blameable?định cấu hình tiện ích mở rộng giáo lý có thể mở rộng với symfony2

Tôi đang sử dụng mã được cung cấp bởi các tài liệu:

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

NHƯNG các cột cơ sở dữ liệu createdBy và updatedBy luôn NULL.

Tài liệu cung cấp ví dụ để định cấu hình các trình nghe khác (ví dụ: dấu thời gian mà tôi đã làm việc) nhưng tôi không tìm thấy ví dụ hoặc tài liệu nào cho người nghe có thể đọc được.

Cảm ơn bạn đã trợ giúp !!

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

EDIT để trả lời Jean:

vâng tôi đã thêm việc sử dụng đó là:

use Gedmo\Mapping\Annotation as Gedmo; 

tôi cũng sử dụng Timestampable với đặc điểm được cung cấp:

use Gedmo\Timestampable\Traits\TimestampableEntity; 

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

và cấu hình định thời gian trên là:

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

Thời gian biểu chỉ hoạt động tốt. Tôi đã thử một cấu hình tương tự cho người nghe blameable vì nó có một phương pháp setUserValue:

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

nhưng nó không hoạt động, tôi nhận được lỗi này (4 bó được những người sử dụng trong dự án của tôi):

Lớp 'Symfony \ Component \ Security \ Core \ Authentication \ Token \ Storage \ TokenStorage' không được tìm thấy trong chuỗi cấu hình không gian tên Cf \ UserBundle \ Entity, Cf \ DocumentBundle \ Entity, Cf \ SouffleBundle \ Entity, FOS \ UserBundle \ Mẫu

Tôi hiểu nó thiếu id người dùng hoặc mã bảo mật làm đối số trong một w ay hay cách khác nhưng tôi không thể tìm thấy một ví dụ nào ở đâu cả. Đó là nơi tôi bị kẹt. Bất kỳ ý tưởng ?

+0

Cậu đặt 'use' trên đầu trang của lớp học của bạn? Bạn có thể cho chúng tôi thấy điều đó không? – Jean

+0

Ngoài ra, Blameable chỉ hoạt động nếu thực thể được tạo \ cập nhật với bối cảnh bảo mật và chứa mã thông báo người dùng, được đưa vào tài khoản và được duy trì trong trường của bạn. – Jean

+0

Bạn có sử dụng [https://github.com/stof/StofDoctrineExtensionsBundle](https://github.com/stof/StofDoctrineExtensionsBundle) không? Tôi có nó và các công việc dễ cháy. – kba

Trả lời

10

Tôi cũng thấy khó để kích hoạt hành vi Blameable với StofDoctrineExtensionsBundle (giả sử bạn đang sử dụng nó).

Có một mảnh của cấu hình mà không được đề cập trong bó rằng:

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

Bên cạnh đó, tôi tạo ra một đặc điểm 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; 
    } 

} 

Và trong tổ chức của bạn, chỉ cần thêm một use tuyên bố như sau:

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

    // ... 

Tôi hy vọng điều này sẽ hữu ích!

2

khoản đóng góp bổ sung nhỏ cho những người bật symfony 3.0 +:

Trong "doctrine_extensions.yml" thêm/sửa đổi:

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

Nếu ai đó vẫn còn có vấn đề này, tôi cuối cùng đã có thể nhận được Gedmo blameable làm việc làm theo các bước sau:

  1. Follow này Hướng dẫn https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/symfony2.md
  2. Thêm phần này vào doctrine_extensions.yml

    gedmo.listener.blameable: 
        class: Gedmo\Blameable\BlameableListener 
        tags: 
        - { name: doctrine.event_subscriber, connection: default } 
        calls: 
        - [ setAnnotationReader, [ "@annotation_reader" ] ] 
    
  3. Sửa đổi phương pháp onKernelRequest như sau:

    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()); 
         } 
        } 
    } 
    
Các vấn đề liên quan