hostnet / entity-blamable-component
监听事件以便设置可审计的信息
Requires
- php: ^7.3|^8.0
- doctrine/orm: ^2.4.0
- hostnet/entity-tracker-component: ^1.2.0||^2.0.0
Requires (Dev)
- hostnet/phpcs-tool: ^9.1.0
- phpunit/phpunit: ^9.5.6
README
文档
什么是可归责组件?
可归责组件是一个利用 实体跟踪组件 并允许您连接到实体变更事件的库。
此组件允许您通过实现 setUpdatedAt()
、setUpdatedBy
和 setCreatedAt()
自动更新实体。在给定的时间,您必须实现所有这些方法。如果您只需要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).