manuakasam / sam-versioning
一个简化实体版本控制的模块
Requires
- php: >=5.3.3
- doctrine/doctrine-orm-module: 0.8.*
- zendframework/zendframework: 2.2.*
Requires (Dev)
- phpunit/phpunit: ~3.7
- satooshi/php-coveralls: ~0.6
- squizlabs/php_codesniffer: ~1.4
This package is not auto-updated.
Last update: 2024-09-23 16:20:41 UTC
README
本模块提供功能以保留您的数据库条目的版本。使用不同的术语,每次您从数据库表中插入或更新一行时,都会将此行的副本保存到单独的表中。也就是说,如果您将此模块配置为这样做;)
模块工作流程
此模块的工作流程非常简单。每当触发您在此模块配置中指定的任何事件时,实体将被序列化并复制到专门的数据库表中。
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 提供相同的特性
- 告诉我您的想法!