manuakasam/sam-versioning

一个简化实体版本控制的模块

dev-master 2013-11-10 15:21 UTC

This package is not auto-updated.

Last update: 2024-09-23 16:20:41 UTC


README

本模块提供功能以保留您的数据库条目的版本。使用不同的术语,每次您从数据库表中插入或更新一行时,都会将此行的副本保存到单独的表中。也就是说,如果您将此模块配置为这样做;)

Scrutinizer Quality Score Build Status Coverage Status

模块工作流程

此模块的工作流程非常简单。每当触发您在此模块配置中指定的任何事件时,实体将被序列化并复制到专门的数据库表中。

Example\Entity\Row1 - saved to DB
  -> serialize Row1
    -> insert to versioning table (ID: 1)
Example\Entity\Row1 - editted by someone
  -> serialize Row1
    -> insert to versioning table (ID: 2 - no update!)

要求

此模块旨在与 Doctrine 2 (DoctrineORMModule) 和 Zend Framework 2 无缝工作。虽然最终目标将是为 Zend\Db 实现相同的特性,但目前尚不支持。

安装

安装此模块最简单的方法是通过使用 Composer

composer.phar require manuakasam/sam-versioning dev-master

之后,您应该更新您的数据库,这可以通过 doctrine 完成

doctrine orm:validate-schema               // Everything OK? Next:
doctrine orm:schema-tool:update --dump-sql // Only updating what you're expecting? Next:
doctrine orm:schema-tool:update --force    // And we're good to go

或通过使用 /data/schema.sql-文件。

剩下的就是以通常的方式将此模块添加到您的 application.config.php 中已加载的模块。

return array(
    'modules' => array(
        'Application',
        'DoctrineModule',
        'DoctrineORMModule',
        'SamVersioning'         // Load order isn't realy important tho
    ),

配置

配置与安装一样简单。将 /SamVersioning/config/sam-versioning.globa.php.dist 复制到您的 /config/autoload 目录,删除 .dist 扩展名,并根据您的需求修改其内容。versionify 数组期望您提供键=值对,即 ClassName => EventName。这样,SamVersioning 将能够监听这些事件。一个例子可以是

return array(
    'sam_versioning' => array(
        'versionify' => array(
            'My\Namespaced\Service'    => 'eventname.additem.post',
            'My\Namespaced\Service'    => 'eventname.edititem.post',
            'Other\Namespaced\Service' => 'objecteditted',
        )
    )
);

事件?什么事件?

在最佳情况下,您已经以这种方式设置了您的服务,以便它们提供您可以轻松挂钩的事件。然而,很多时候情况并非如此,将您的服务更改为提供事件只需两行代码。请参见以下示例

namespace MyNS\Services;
class SomeService {
    public function saveEntity($entity) {
        $this->dbMapper->save($entity);
    }
}

像这样,SamVersioning 无法做任何事情来跟踪 $entity 的版本,所以让我们修改代码以允许我们跟踪它。请确保将实体作为名为 object 的参数附加到您的事件中

namespace MyNS\Services;
class SomeService {
    public function saveEntity($entity) {
        $this->dbMapper->save($entity);

        $eventManager = new EventManager('MyNS\Services\SomeService');
                                                          // notice this array and the object key
        $eventManager->trigger('save-entity.post', $this, array('object' => $entity));
    }
}

就这样,此服务的配置将是这样的

return array(
    'sam_versioning' => array(
        'versionify' => array(
            'MyNS\Services\SomeService' => 'save-entity.post'
        )
    )
);

待办事项

  • 学习如何进行单元测试
  • 实现单元测试
  • 提供视图辅助器以轻松访问早期版本
  • 提供早期版本的回滚功能
  • 为 Zend\Db 提供相同的特性
  • 告诉我您的想法!