coffreo/ceph-odm

该软件包最新版本(0.4.0)没有提供许可证信息。

Ceph 的 Doctrine 骨架映射器 ODM

0.4.0 2019-02-12 09:26 UTC

This package is auto-updated.

Last update: 2024-09-19 20:25:32 UTC


README

Build Status codecov

该仓库提供了一个基于 Doctrine 映射器骨架的 Ceph odm。

安装

推荐使用 composer 安装此项目

$ composer require coffreo/ceph-odm

基本用法

首先,您需要实例化一个 Amazon S3 客户端

$s3Client = new \Aws\S3\S3Client([
    'region' => '',
    'version' => '2006-03-01',
    'endpoint' => 'http://my-ceph-server/',
    'use_path_style_endpoint' => true,
    'credentials' => ['key' => 'userAccessKey', 'secret' => 'userSecretKey']
]);

use_path_style_endpoint 是重要的,它允许内部生成如 http://my-ceph-server/mybucket 这样的 URL,而不是如 http://mybucket.my-ceph-server/ 这样的 URL。

一旦客户端实例化,就可以用它来创建您的 ObjectManager

$objectManager =  \Coffreo\CephOdm\Factory\ObjectManagerFactory::create($s3Client);

注意,如果您需要处理 Doctrine 事件,可以将 Doctrine\Common\EventManager 作为 create 的第二个参数传递。

创建一个存储桶

在创建对象之前,您必须创建一个用于存储对象的存储桶

$objectManager->persist(new \Coffreo\CephOdm\Entity\Bucket('my-bucket'));
$objectManager->flush();

创建一个新的对象

$object = new \Coffreo\CephOdm\Entity\File();
$object->setBucket(new \Coffreo\CephOdm\Entity\Bucket('my-bucket'));
$object->setFilename('test.txt');
$object->setBin('my-file-content');
$object->setAllMetadata(['my-metadata1' => 'my-value1', 'my-metadata2' => 'my-value2']);
$objectManager->persist($object);
$objectManager->flush();
$objectManager->clear();

echo $object->getId(); // e223fc11-8046-4a84-98e2-0de912d071e9 for instance since object is stored

请注意,只有小写字符串被接受作为元数据键。

更新一个对象

$object->setBin('my-content-updated);
$object->addMetadata('my-metadata2', 'my-new-metadata-value);
$objectManager->flush();
$objectManager->clear();

删除一个对象

$objectManager->remove($object);
$objectManager->flush();
$objectManager->clear();

复制一个对象

您可以通过再次持久化实体轻松地克隆一个对象。要注意的唯一一件事是分离实体

$object = $fileRepository->find(/* ... */);
$objectManager->detach($object);

// You can update (or not) the object properties before saving it
$object->setBin('my-other-content');

$objectManager->persist();
$objectManager->flush();

对象将以新的 ID 保存。您还可以将其保存到另一个存储桶

$object = $fileRepository->find(/* ... */);
$objectManager->detach($object);

$object->setBucket(new \Coffreo\CephOdm\Entity\Bucket('my-bucket-2));
// You can update (or not) the object properties before saving it
$object->setBin('my-other-content');

$objectManager->persist();
$objectManager->flush();

通过其标识符查找一个对象

存储桶和 ID 是对象的标识符。

$fileRepository = $objectManager->getRepository(\Coffreo\CephOdm\Entity\File::class);
$object = $fileRepository->find([new \Coffreo\CephOdm\Entity\Bucket('my-bucket'), 'e223fc11-8046-4a84-98e2-0de912d071e9']);

echo $object->getFilename();    // test.txt

在存储库查找方法中,您必须在您的标准中使用存储桶名称或存储桶对象

$object = $fileRepository->find([new \Coffreo\CephOdm\Entity\Bucket('my-bucket'), 'e223fc11-8046-4a84-98e2-0de912d071e9']);

等同于

$object = $fileRepository->find(['my-bucket', 'e223fc11-8046-4a84-98e2-0de912d071e9']);

其他查找方法

$objects = $fileRepository->findAll();  // All objects of all buckets

$objects = $fileRepository->findBy(['bucket' => 'my-bucket']);  // All objects of the bucket
$objects = $fileRepository->findBy(['id' => 'e223fc11-8046-4a84-98e2-0de912d071e9']); // All objects in any bucket of the given id

前面的语句仅返回 登录用户拥有的 对象。目前,您只能对存储桶和/或 ID 执行搜索。

通过元数据过滤结果

您还可以使用元数据作为过滤器

$objects = $fileRepository->findBy(['bucket' => 'my-bucket', 'metadata' => ['mymetadata' => 'myvalue']]);

请注意,它只是一个过滤器。它不是原生的,所有文件都会被检索,过滤是在之后完成的。此外,准则 metadata => [] 不会返回没有元数据的所有文件。这意味着没有元数据过滤器,因此将根据可能的其它准则返回所有文件。

排序结果

结果可以进行排序,但这不是数据库排序。排序是程序执行的,因此它没有被优化,并且它是在桶限制之后应用的。默认情况下,结果按存储桶名称和 ID 排序。要按文件名元数据(降序)和 ID(升序)对查询进行排序

$objects = $fileRepository->findBy([], ['metadata' => ['filename' => -1], 'id' => 1]);

截断结果

对于返回许多文件(findByfindAll)的查找方法,如果结果太多(超过您指定的限制或默认的 1000),则通过 getBucketsTruncated 返回无法返回所有文件的存储桶的名称

// Let's set the limit to 10
$objects = $fileRepository->findBy(['bucket' => 'mybucket'], [], 10);
foreach ($objects->getBucketsTruncated() as $bucketName) {
    // some files of the bucket $bucketName ('mybucket' in our case) was not returned
}

恢复截断查询

您可以使用 continue 参数来恢复先前截断的查询。例如,用于检索上述查询未检索到的 mybucket 的文件

// It may be necessary to do this call many times. Do this call in a loop until $objects->getBucketsTruncated() returns an empty array.
$objects = $fileRepository->findBy(['bucket' => 'mybucket'], [], null, 1);

为此,存储库会在存储桶中保留对最后返回的文件的指针。请注意,当在存储桶上执行另一个查询时,此指针将被修改;下面的调用更新了存储桶 mybucket 的指针

  • findBy(['bucket' => 'mybucket'])
  • findOneBy(['id' => 'myid'])
  • findBy([])
  • findAll
    只有 find 从不修改内部指针。

这是另一个检索连接用户所有文件的示例

$truncated = []
do {
   $objects = $fileRepository->findBy([], [], null, $truncated ? 1 : 0);
   // Do something with objects
   $truncated = $objects->getBucketsTruncated();
} while ($truncated);

请注意,您也可以在第一次调用中使用 findAll

最后,findByFrom 方法返回给定标识符之后的文件

$objects = $fileRepository->findByFrom(['bucket' => 'mybucket'], ['mybucket' => 'myid3']);
// Returns files myid4, myid5, myid6... but not myid3
// Since the criteria specifies the bucket, you can even simplify by: findByFrom(['bucket' => 'mybucket'], 'myid3')

懒加载

当使用返回多个结果的查询时(即未指定桶和id的查询),由于获取它们需要为每个结果执行另一个特定的服务器调用,因此不会直接加载 binmetadata。在这种情况下,该库使用懒加载策略,并且仅在调用 getBingetAllMetadatagetMetadatasetMetadata 时才检索 bin 和 metadata。您通常不必担心这一点,但了解这一点可能是有用的。