coffreo / ceph-odm
Ceph 的 Doctrine 骨架映射器 ODM
Requires
- php: ^7.1
- aws/aws-sdk-php: ^3.85
- doctrine/skeleton-mapper: 0.0.1
- ramsey/uuid: ^3.8
Requires (Dev)
- coffreo/php-cs-fixer-config: ^2.1
- phpunit/phpunit: ^7.5
This package is auto-updated.
Last update: 2024-09-19 20:25:32 UTC
README
该仓库提供了一个基于 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]);
截断结果
对于返回许多文件(findBy
和 findAll
)的查找方法,如果结果太多(超过您指定的限制或默认的 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的查询),由于获取它们需要为每个结果执行另一个特定的服务器调用,因此不会直接加载 bin
和 metadata
。在这种情况下,该库使用懒加载策略,并且仅在调用 getBin
、getAllMetadata
、getMetadata
或 setMetadata
时才检索 bin 和 metadata。您通常不必担心这一点,但了解这一点可能是有用的。