doctrine/key-value-store

此包已被弃用,不再维护。未建议替代包。

简单的键值存储抽象层,映射到PHP对象,支持多种后端。

v0.4.0 2019-11-15 18:45 UTC

README

Build Status

在NoSQL世界中,许多实现都过于复杂,这些实现只是键值存储并附加了一些额外功能。Doctrine键值存储项目可以解决这个问题。该项目提供了一个更简单、更轻量级的API,以键值API为中心,用于获取/保存对象。

  • 单值或多值主键
  • 无结构/无模式的值,这些值映射到对象上
  • 根据实现,支持嵌入的值/对象
  • 无需复杂的映射,只需在类上添加 @Entity 注解,所有属性都会自动映射,除非有 @Transient 注解。至少有一个属性必须是 @Id。但这也取决于底层供应商。
  • 属性不必存在于类中,对于缺失的属性将创建公共属性。
  • 不支持对其他对象的引用
  • ODM/ORM的事件监听器,允许将键值实体及其集合作为属性进行管理(postLoad、postUpdate、postPersist、postRemove)
  • 简化后的对象管理接口
  • 数据映射器与其他Doctrine库类似,持久化和数据对象是分离的。
  • 继承(单一或多个存储)

实现

以下供应商是目标

  • Microsoft Azure Table(已实现)
  • Doctrine\Common\Cache提供者(已实现)
  • RDBMS(已实现)
  • Couchbase(已实现)
  • Amazon DynamoDB(已实现)
  • CouchDB(已实现)
  • Cassandra
  • MongoDB(已实现)
  • Riak(已实现)
  • Redis(已实现)

我们愉快地接受对任何驱动程序的贡献。

示例

假设我们根据活动ID和接收者跟踪电子邮件活动。

<?php
use Doctrine\KeyValueStore\Mapping\Annotations as KeyValue;

/**
 * @KeyValue\Entity(storageName="responses")
 */
class Response
{
    const RECEIVE = 0;
    const OPEN = 10;
    const CLICK = 20;
    const ACTION = 30;

    /** @KeyValue\Id */
    private $campaign;
    /** @KeyValue\Id */
    private $recipient;
    private $status;
    private $date;

    public function __construct($campaign, $recipient, $status)
    {
        $this->campaign = $campaign;
        $this->recipient = $recipient;
        $this->status = $status;
    }
}

创建

<?php
$response = new Response("1234", "[email protected]", Response::RECEIVE);

$entityManager->persist($response);
//.... persists as much as you can :-)

$entityManager->flush();

读取

<?php
$response = $entityManager->find("Response",array("campaign" => "1234","recipient" => "[email protected]"));

更新

与创建相同,只需重用相同的ID。

删除

<?php
$response = $entityManager->find("Response",array("1234","[email protected]"));
$entityManager->remove($response);
$entityManager->flush();

配置

目前还没有工厂简化创建过程,以下是需要实例化具有Doctrine缓存后端的关键值实体管理器的完整代码。

<?php
use Doctrine\KeyValueStore\EntityManager;
use Doctrine\KeyValueStore\Configuration;
use Doctrine\KeyValueStore\Mapping\AnnotationDriver;
use Doctrine\KeyValueStore\Storage\DoctrineCacheStorage;
use Doctrine\Common\Cache\ArrayCache;
use Doctrine\Common\Annotations\AnnotationReader;

$cache = new ArrayCache;
$storage = new DoctrineCacheStorage($cache);

$reader = new AnnotationReader();
$metadata = new AnnotationDriver($reader);
$config = new Configuration();
$config->setMappingDriverImpl($metadata);
$config->setMetadataCache($cache);

$entityManager = new EntityManager($storage, $config);

如果您想使用WindowsAzure Table,可以使用以下配置来实例化存储。

use Doctrine\KeyValueStore\Storage\AzureSdkTableStorage;
use WindowsAzure\Common\ServicesBuilder;

$connectionString = ""; // Windows Azure Connection string
$builder = ServicesBuilder::getInstance();
$client = $builder->createTableService($connectionString);

$storage = new AzureSdkTableStorage($client);

如果您想使用Doctrine DBAL作为后端

$params = array();
$tableName = "storage";
$idColumnName = "id";
$dataColumnName = "serialized_data";

$conn = DriverManager::getConnection($params);
$storage = new DBALStorage($conn, $tableName, $idColumnName, $dataColumnName);