hostnet/entity-blamable-component

监听事件以便设置可审计的信息

1.0.5 2022-05-04 09:37 UTC

This package is auto-updated.

Last update: 2024-09-04 14:29:14 UTC


README

文档

什么是可归责组件?

可归责组件是一个利用 实体跟踪组件 并允许您连接到实体变更事件的库。

此组件允许您通过实现 setUpdatedAt()setUpdatedBysetCreatedAt() 自动更新实体。在给定的时间,您必须实现所有这些方法。如果您只需要1个或2个方法,始终允许拉取请求。由于缺乏我们的用例需求,尚未实现。

需求

可归责组件需要至少PHP 5.4,并在Doctrine2上运行。有关具体要求,请检查 composer.json

安装

安装相当简单,此软件包可在 packagist 上使用。您可以注册锁定到主版本的软件包,因为我们遵循 语义版本控制2.0.0

示例

    "require" : {
        "hostnet/entity-blamable-component" : "1.*"
    }

注意:如果您想使用最新的更改,可以使用 dev-master,但这不建议用于生产代码!

文档

它是如何工作的?

它通过在您的实体上放置 @Blamable 注解和 BlamableInterface,并在实体变更事件上注册监听器来实现。假设您已经配置了 实体跟踪组件

以下是一个用法示例。

设置

  • 您必须将 @Blamable 添加到您的实体中
  • 您必须将 BlamableInterface 添加到您的实体中
  • 您必须在对象上实现 BlamableProviderInterface 并将其传递给监听器

注册事件

以下是一个非常基本的设置示例。如果您使用具有依赖注入容器的框架,设置将更加简单。

设置可能看起来有点复杂,但实际上大部分是设置跟踪组件。如果您在框架中使用它,建议为此创建特定于框架的配置软件包来自动化此过程。

注意:如果您使用Symfony2,可以查看 hostnet/entity-tracker-bundle。此软件包旨在为您配置服务。

use Acme\Bundle\AcmeBundle\Service\AcmeBlamableProvider;
use Hostnet\Component\EntityBlamable\Listener\BlamableListener;
use Hostnet\Component\EntityBlamable\Resolver\BlamableResolver;
use Hostnet\Component\EntityTracker\Listener\EntityChangedListener;
use Hostnet\Component\EntityTracker\Provider\EntityAnnotationMetadataProvider;
use Hostnet\Component\EntityTracker\Provider\EntityMutationMetadataProvider;

/* @var $em \Doctrine\ORM\EntityManager */
$event_manager = $em->getEventManager();

// default doctrine annotation reader
$annotation_reader = new AnnotationReader();

// setup required providers
$mutation_metadata_provider   = new EntityMutationMetadataProvider($annotation_reader);
$annotation_metadata_provider = new EntityAnnotationMetadataProvider($annotation_reader);

// pre flush event listener that uses the @Tracked/@Blamable annotation
$entity_changed_listener = new EntityChangedListener(
    $mutation_metadata_provider,
    $annotation_metadata_provider
);

// the resolver is used to find the correct annotation
$blamable_resolver = new BlamableResolver($annotation_metadata_provider);

// the object that will provide the username and date time. This is an 
// application specific implementation of the BlamableProviderInterface
$blamable_provider = new AcmeBlamableProvider();

// creating the blamable listener
$blamable_listener = new BlamableListener($blamable_resolver, $blamable_provider);

// register the events
$event_manager->addEventListener('preFlush', $entity_changed_listener);
$event_manager->addEventListener('entityChanged', $blamable_listener);

为用户名和时间戳创建提供者

提供者用于向 BlamableListener 提供所需值,这是您项目中唯一需要自定义实现的接口。

注意:在示例中,用户名定义为构造函数参数,但您可能想注入包含当前登录用户并获取该标识符的内容。

namespace Acme\Bundle\AcmeBundle\Service;

use Hostnet\Component\EntityBlamable\Provider\BlamableProviderInterface;

class AcmeBlamableProvider implements BlamableProviderInterface
{
    private $username;

    public function __construct($username)
    {
        $this->username = $username;
    }

    public function getUpdatedBy()
    {
        return $this->username;
    }
    
    public function getChangedAt()
    {
        return new \DateTime();
    }
}

配置实体

我们现在需要做的只是将 @Blamable 注解和 BlamableInterface 放到我们的实体上。

use Doctrine\ORM\Mapping as ORM;
use Hostnet\Component\EntityBlamable\Blamable;
use Hostnet\Component\EntityBlamable\BlamableInterface;

/**
 * @ORM\Entity
 * @Blamable
 */
class MyEntity implements BlamableInterface
{
    /**
     * @ORM\...
     */
    private $updated_by;
    
    /**
     * @ORM\...
     */
    private $updated_at;
    
    /**
     * @ORM\...
     */
    private $created_at;
    
    public function setUpdatedBy($by)
    {
        $this->updated_by = $by;
    }

    public function setUpdatedAt(\DateTime $at)
    {
        $this->changed_at = $at;
    }
    
    public function setCreatedAt(\DateTime $at)
    {
        $this->created_at = $at
    }
}

接下来是什么?

$entity->setName('henk');
$em->flush();
// Voila, your updated_at and updated_by are filled in (and if it's new, created_at too).