vincentauger/datacite-php-sdk
Composer 安装命令:
composer require vincentauger/datacite-php-sdk
包简介
A modern PHP SDK for DataCite API
README 文档
README
A modern PHP SDK for the DataCite REST API, built for maintainability and clarity using Saloon for HTTP integration.
Features
- ✅ Modern PHP 8.4+ - Typed properties, readonly classes, enums, and constructor property promotion
- ✅ Full DOI Management - Create, read, update, delete, and search DOI records
- ✅ DataCite Events - Query and retrieve usage events for DOIs
- ✅ Advanced Query Builder - Fluent interface for complex searches with boolean logic
- ✅ Typed DTOs - Fully typed data transfer objects for all API responses
- ✅ Built on Saloon - Powerful HTTP client with mocking and testing support
- ✅ Framework Agnostic - Works with any PHP framework or standalone
- ✅ Comprehensive Tests - Full test coverage with Pest PHP
Installation
composer require vincentauger/datacite-php-sdk
Requirements:
- PHP 8.4+
- Composer
Quick Start
Initialize the Client
Public API (Read-Only)
use VincentAuger\DataCiteSdk\DataCite; // No credentials needed for public read-only access $datacite = new DataCite();
Member API (Full Access)
use VincentAuger\DataCiteSdk\DataCite; // Credentials required for create/update/delete operations $datacite = new DataCite( username: 'your-repository-id', password: 'your-repository-password', mailto: 'your-email@example.com' // Optional but recommended );
Usage Examples
Get a Single DOI
Quick way (convenience method):
// Simple one-liner for basic operations $response = $datacite->getDOI('10.5438/4k3m-nyvg'); $doi = $response->dto(); echo $doi->data->attributes->titles[0]->title; echo $doi->data->attributes->creators[0]->name; echo $doi->data->attributes->publicationYear;
Advanced way (using request objects):
use VincentAuger\DataCiteSdk\Requests\DOIs\GetDOI; // Use request objects when you need more control $request = new GetDOI('10.5438/4k3m-nyvg'); $response = $datacite->send($request); $doi = $response->dto();
List DOIs
use VincentAuger\DataCiteSdk\Requests\DOIs\ListDOIs; use VincentAuger\DataCiteSdk\Enums\SortOption; $request = (new ListDOIs) ->withPageSize(25) ->withSortDesc(SortOption::CREATED); $response = $datacite->send($request); $results = $response->dto(); foreach ($results->data as $doi) { echo "{$doi->id}: {$doi->attributes->titles[0]->title}\n"; } echo "Total: {$results->meta->total}\n";
Search DOIs with Query Builder
use VincentAuger\DataCiteSdk\Query\QueryBuilder; use VincentAuger\DataCiteSdk\Enums\QueryField; use VincentAuger\DataCiteSdk\Requests\DOIs\ListDOIs; $query = (new QueryBuilder) ->whereEquals(QueryField::PUBLICATION_YEAR, '2023') ->whereContains(QueryField::TITLES_TITLE, 'climate') ->whereExists(QueryField::FUNDING_REFERENCES_FUNDER_NAME); $request = (new ListDOIs)->withQuery($query); $response = $datacite->send($request); $results = $response->dto();
Create a DOI
use VincentAuger\DataCiteSdk\Data\CreateDOIInput; use VincentAuger\DataCiteSdk\Data\Metadata\Creator; use VincentAuger\DataCiteSdk\Data\Metadata\Title; use VincentAuger\DataCiteSdk\Data\Metadata\ResourceType; use VincentAuger\DataCiteSdk\Enums\ResourceTypeGeneral; use VincentAuger\DataCiteSdk\Enums\DOIEvent; $input = new CreateDOIInput( doi: '10.5438/example-doi', url: 'https://example.com/dataset', titles: [new Title('My Dataset Title')], creators: [new Creator(name: 'Smith, John')], publisher: new PublisherData(name: 'Example Publisher'), publicationYear: 2025, types: new ResourceType( resourceTypeGeneral: ResourceTypeGeneral::DATASET, resourceType: 'Dataset' ), event: DOIEvent::PUBLISH // Optional: publish, register, or hide ); // Quick way (convenience method) $response = $datacite->createDOI($input); $doi = $response->dto(); // Or use request object for more control $request = new CreateDOI($input); $response = $datacite->send($request);
Update a DOI
use VincentAuger\DataCiteSdk\Data\UpdateDOIInput; $input = new UpdateDOIInput( doi: '10.5438/example-doi', titles: [new Title('Updated Title')], // ... other updated fields ); // Quick way (convenience method) $response = $datacite->updateDOI('10.5438/example-doi', $input); // Or use request object $request = new UpdateDOI('10.5438/example-doi', $input); $response = $datacite->send($request);
Delete a DOI
// Only works for draft DOIs $response = $datacite->deleteDOI('10.5438/draft-doi'); // Or use request object $request = new DeleteDOI('10.5438/draft-doi'); $response = $datacite->send($request);
Get DOI Activities
// Quick way (convenience method) $response = $datacite->getDOIActivities('10.5438/4k3m-nyvg'); $activities = $response->dto(); foreach ($activities->data as $activity) { echo "{$activity->attributes->action} at {$activity->attributes->createdAt}\n"; } // Or use request object use VincentAuger\DataCiteSdk\Requests\DOIs\GetDOIActivities; $request = new GetDOIActivities('10.5438/4k3m-nyvg'); $response = $datacite->send($request);
List Events
use VincentAuger\DataCiteSdk\Requests\Events\ListEvents; use VincentAuger\DataCiteSdk\Enums\EventSortOption; use VincentAuger\DataCiteSdk\Enums\EventSource; $request = (new ListEvents) ->withDoiId('10.5438/4k3m-nyvg') ->withSource(EventSource::CROSSREF) ->withYearMonth(2023, 6) ->withSortDesc(EventSortOption::TOTAL) ->withPageSize(25); $response = $datacite->send($request); $events = $response->dto(); foreach ($events->data as $event) { echo "{$event->id}: {$event->attributes->total} occurrences\n"; }
Get a Single Event
// Quick way (convenience method) $response = $datacite->getEvent('event-id-here'); $event = $response->dto(); // Or use request object use VincentAuger\DataCiteSdk\Requests\Events\GetEvent; $request = new GetEvent('event-id-here'); $response = $datacite->send($request);
Convenience Methods
The SDK provides convenient shorthand methods for common operations:
// System $datacite->heartbeat(): bool // DOIs $datacite->getDOI(string $doi): Response $datacite->getDOIActivities(string $doi): Response $datacite->createDOI(CreateDOIInput $input): Response $datacite->updateDOI(string $doi, UpdateDOIInput $input): Response $datacite->deleteDOI(string $doi): Response // Events $datacite->getEvent(string $eventId): Response
When to use convenience methods:
- ✅ Quick, simple operations
- ✅ Getting started with the SDK
- ✅ Straightforward single-resource retrieval
When to use request objects:
- ✅ Complex queries with filters
- ✅ Pagination and sorting
- ✅ Using the QueryBuilder
- ✅ Need to customize request behavior
Advanced Features
Query Builder
Build complex search queries with a fluent interface. See docs/QueryBuilder.md for full documentation.
use VincentAuger\DataCiteSdk\Query\QueryBuilder; use VincentAuger\DataCiteSdk\Enums\QueryField; $query = (new QueryBuilder) ->whereEquals(QueryField::PUBLICATION_YEAR, '2023') ->whereOr(function (QueryBuilder $builder) { $builder ->whereContains(QueryField::TITLES_TITLE, 'climate') ->whereContains(QueryField::TITLES_TITLE, 'weather'); }) ->whereExists(QueryField::CREATORS_NAME_IDENTIFIER);
Available Methods:
whereEquals(),whereNotEquals()- Exact matchingwhereContains()- Case-insensitive contains searchwhereStartsWith(),whereEndsWith()- Wildcard prefix/suffixwhereExists(),whereNotExists()- Field presence checkswhereIn(),whereNotIn()- Multiple value matchingwhereAnd(),whereOr()- Boolean logic groupingwhereExact()- Quoted exact match for phrases
Sorting and Filtering
Apply sorting, filtering, and pagination to list requests. See docs/sorting-and-filtering.md for examples.
use VincentAuger\DataCiteSdk\Enums\SortOption; $request = (new ListDOIs) ->withProviderId('cern') ->withClientId('cern.zenodo') ->withCreated('2023-01-01,2023-12-31') // Date range ->withHasPerson(true) ->withHasFundingReference(true) ->withSortDesc(SortOption::CREATED) ->withPageSize(50) ->withPage(2) ->withAffiliation() // Include additional data ->withPublisher();
DOI Sort Options:
RELEVANCE- Search relevance (default)NAME- DOI nameCREATED- Creation dateUPDATED- Last updatedPUBLISHED- Publication dateREGISTERED- Registration date
Event Sort Options:
RELEVANCE- Search relevanceOBJ_ID- Object IDTOTAL- Total occurrencesCREATED- Creation dateUPDATED- Last updated
Working with DTOs and Type Hints
All API responses return fully typed Data Transfer Objects (DTOs) for type safety and IDE autocomplete. However, due to how Saloon creates DTOs, you may lose type information when calling ->dto().
Getting Proper Type Hints
Option 1: Use PHPDoc annotation (Recommended)
use VincentAuger\DataCiteSdk\Data\DOIData; /** @var DOIData $doi */ $doi = $response->dto(); // Now you get full IDE autocomplete and type checking $title = $doi->data->attributes->titles[0]->title;
Option 2: Use createDtoFromResponse() directly
$request = new GetDOI('10.5438/4k3m-nyvg'); $response = $datacite->send($request); // This method returns the correct type automatically $doi = $request->createDtoFromResponse($response);
Available DTOs
| Request Type | DTO Class | Description |
|---|---|---|
GetDOI |
DOIData |
Single DOI response |
ListDOIs |
ListDOIData |
Paginated DOI list |
CreateDOI |
DOIData |
Created DOI response |
UpdateDOI |
DOIData |
Updated DOI response |
GetDOIActivities |
DOIActivitiesData |
DOI activity log |
GetEvent |
EventData |
Single event response |
ListEvents |
ListEventData |
Paginated event list |
Example with proper typing:
use VincentAuger\DataCiteSdk\Data\DOIData; use VincentAuger\DataCiteSdk\Data\ListDOIData; // Single DOI /** @var DOIData $doi */ $doi = $datacite->getDOI('10.5438/0012')->dto(); // List of DOIs /** @var ListDOIData $results */ $results = $datacite->send(new ListDOIs)->dto(); foreach ($results->data as $doiItem) { // Full autocomplete available echo $doiItem->attributes->titles[0]->title; }
Configuration
Client Options
| Parameter | Type | Default | Description |
|---|---|---|---|
baseUrl |
string |
https://api.datacite.org |
DataCite API base URL |
username |
string|null |
null |
Repository ID (required for member API) |
password |
string|null |
null |
Repository password (required for member API) |
mailto |
string|null |
null |
Email for User-Agent header (optional) |
Authentication
The SDK supports two access levels:
- Public API (default) - Read-only access to DOI metadata and events (no credentials needed)
- Member API - Full access including create/update/delete (requires credentials)
// Public API - read-only $datacite = new DataCite(); // Member API - full access $datacite = new DataCite( apiVersion: ApiVersion::MEMBER, username: 'your-repository-id', password: 'your-repository-password' );
Endpoints that modify data (POST, PUT, DELETE) use the RequiresMemberAuth trait and will throw a RuntimeException if you attempt these operations without proper authentication.
API Coverage
System
- ✅
GET /heartbeat- Check API status
DOIs
- ✅
GET /dois- List DOIs with advanced filtering - ✅
GET /dois/{id}- Get a single DOI - ✅
POST /dois- Create a new DOI (member only) - ✅
PUT /dois/{id}- Update a DOI (member only) - ✅
DELETE /dois/{id}- Delete a draft DOI (member only) - ✅
GET /dois/{id}/activities- Get DOI activity log
Events
- ✅
GET /events- List events with filtering - ✅
GET /events/{id}- Get a single event
Contributing
Contributions are welcome! Please see CONTRIBUTING.md for:
- Development environment setup
- Coding standards and guidelines
- Testing requirements
- Pull request process
Documentation
- QueryBuilder.md - Complete query builder reference with examples
- sorting-and-filtering.md - Sorting, filtering, and pagination examples
License
MIT License — see LICENSE.md for details.
Disclaimer
This SDK is unofficial and not affiliated with DataCite.
- Use at your own risk
- Respect DataCite API rate limits and terms of service
- Ensure proper authentication and security for member API credentials
- Always test in a non-production environment first
For official DataCite documentation, visit support.datacite.org/docs.
vincentauger/datacite-php-sdk 适用场景与选型建议
vincentauger/datacite-php-sdk 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 28 次下载、GitHub Stars 达 1, 最近一次更新时间为 2025 年 11 月 05 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「package」 「php」 「api」 「sdk」 「datacite」 「open science」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 vincentauger/datacite-php-sdk 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 vincentauger/datacite-php-sdk 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 vincentauger/datacite-php-sdk 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A PSR-7 compatible library for making CRUD API endpoints
Simple ASCII output of array data
Alfabank REST API integration
Package for view storage in laravel
User Approval Laravel Package
统计信息
- 总下载量: 28
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 1
- 点击次数: 14
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2025-11-05