incraigulous / contentful-sdk
Requires
- php: >=5.4.0
- guzzlehttp/guzzle: 5.1.*
Requires (Dev)
- phpunit/phpunit: 4.*
README
#已弃用。请使用Contentful官方的PHP SDK。
PHP Contentful SDK
Contentful交付和管理API的现代PHP SDK。
###这是一个与框架无关的PHP SDK。
####寻找Laravel工具包?
点击此处获取Laravel外观、基础存储库、开箱即用的缓存和缓存管理、通过命令创建webhook等功能。
##安装
通过运行以下命令安装:
composer require "incraigulous/contentful-sdk:0.0.*"
##如何使用
###内容交付API
####初始化
创建交付SDK的新实例
use Incraigulous\ContentfulSDK\DeliverySDK;
$deliverySDK = new DeliverySDK('TOKEN', 'SPACE_ID', $cacher);
令牌:您的Contentful API令牌。您可以使用Contentful控制面板生成此令牌。
空间ID: (可选) 实例执行的调用所使用的空间。要使用多个空间,您应使用多个SDK实例。如果您不提供空间ID,则只能使用spaces资源。
缓存器: (可选,Incraigulous\ContentfulSDK\CacherInterface实现) 一个用于处理缓存的对象。这是可选的(并且易于实现),所以不要让它让您感到害怕。请查看缓存部分以获取更多详细信息。
####空间
#####获取所有空间
$result = $deliverySDK->spaces()->get();
#####获取一个空间
$result = $deliverySDK->spaces()
->find('SPACE_ID')
->get();
####内容类型
#####获取内容类型
$result = $deliverySDK->contentTypes()
->find('CONTENT_TYPE_ID')
->get();
#####搜索内容类型
$result = $deliverySDK->contentTypes()
->where('name', '=', 'Blog Post')
->get();
或
$result = $deliverySDK->contentTypes()
->where('name', 'ne', 'Blog Post')
->limit(2)
->get();
查看搜索参数了解如何搜索特定内容。
####条目
#####通过ID获取条目
$result = $deliverySDK->entries()
->find('ENTRY ID')
->get();
#####搜索条目
$result = $deliverySDK->entries()
->limitByType('CONTENT TYPE ID')
->where('fields.title', 'match', 'campus')
->where('fields.location', 'near', '22,23')
->limit(10)
->get();
######在搜索结果中包括链接条目
$result = $deliverySDK
->where('sys.id', '=', 'ENTRY ID')
->includeLinks(3)
->get();
includeLinks接受您想要包含的链接级别数。
####资产
#####列出所有资产
$result = $deliverySDK->assets()
->limit(10)
->get();
#####通过ID获取资产
$deliverySDK->assets()
->find('ASSET ID')
->get();
#####搜索资产
$result = $deliverySDK->assets()
->where('fields.file.details.size', '>=', 350000)
->limit(5)
->get();
####搜索参数
搜索很简单!只需在您的资源上调用以下方法之一。如上所示,在资产资源上使用where()和limit()是一个很好的搜索示例。
#####Where筛选运算符
有关搜索的更详细文档,请参阅Contentful的API文档。
#####缓存
我建议您缓存所有内容交付API GET请求的结果(即Memcached或Redis)。如果您正在处理流量较低的网站,您可能不需要缓存,但无论如何都会大大提高性能。
一种方法是将所有API GET调用包裹在缓存检查中,但这可能导致代码重复。幸运的是,还有更好的方法。
我已经包含了一个缓存器接口。不用担心,它只需要四个方法。只需创建一个实现了 Incraigulous\ContentfulSDK\CacherInterface 的类,并在实例化 SDK 时将其作为第三个参数传递。SDK 会处理其余部分。每个 GET 请求都将使用您的缓存器类生成的唯一键进行缓存。
$cacher = new CustomCacher();
$deliverySDK = new DeliverySDK('SPACE_ID', 'TOKEN', $cacher);
如果为 Redis 或 Memcached 构建了一个通用的 PHP 缓存器实现,请提交一个拉取请求。我很乐意将其包含在存储库中。
###管理 API
####初始化
创建管理 SDK 的新实例
use Incraigulous\ContentfulSDK\ManagementSDK;
$managementSDK = new ManagementSDK('TOKEN', 'SPACE_ID');
令牌:您的 Contentful OAuth 令牌。
空间ID: (可选) 实例执行的调用所使用的空间。要使用多个空间,您应使用多个SDK实例。如果您不提供空间ID,则只能使用spaces资源。
请注意,还有一个用于缓存器的第三个参数。管理 API 调用目前不会缓存,以确保
GET请求是最新的,从而避免在更新记录时发生冲突。我仍然想提供一个地方来提供缓存器,以防我决定用它来做什么。您可以选择忽略它,或者为了保险起见提供缓存器。
####使用构建器对象 Contentful 负载数据可以很复杂,尤其是在处理 entries 或 assets 时。构建器类就在这里帮助!它们是可选的帮助类,可以帮助构建负载数据。它们会为您构建负载数组,并在构建过程中通知您有哪些选项。如果您使用的 IDE 有提示功能,它们会非常有帮助。
如果您不想使用它们,就不要使用它们。SDK 会解析负载数据,查找构建器对象,并将它们转换为数组,然后再将请求传递给 Contentful。因此,您可以使用标准数组或由构建器对象组成的数组。
以下示例将假设您正在使用所需的构建器
use Incraigulous\ContentfulSDK\PayloadBuilders\Entry;
use Incraigulous\ContentfulSDK\PayloadBuilders\EntryField;
use Incraigulous\ContentfulSDK\PayloadBuilders\Space;
...
####空间
#####创建空间
$result = $managementSDK->spaces()
->post(
new Space('My Space')
);
#####更新空间
$space = $managementSDK->spaces()
->find('SPACE_ID')
->get();
$space['name'] = 'Outer Space';
$result = $managementSDK->spaces()->put('SPACE_ID', $space);
#####删除空间
$result = $managementSDK->spaces()->delete('SPACE_ID');
####内容类型
#####创建内容类型
$result = $managementSDK->contentTypes()
->post(
new ContentType('Blog Post', 'title', [
new ContentTypeField('title', 'Title', 'Text'),
new ContentTypeField('body', 'Body', 'Text'),
])
);
);
#####创建带有验证和链接的内容类型
$result = $managementSDK->contentTypes()
->post(
new ContentType('Blog Post', 'title', [
new ContentTypeField('title', 'Title', 'Text'),
new ContentTypeField('body', 'Body', 'Text'),
(new ContentTypeField('author', 'Field List', 'Link'))->setLink('Entry'),
(new ContentTypeField('sidebar', 'Field List', 'Array'))->setMultiLink('Entry'),
(new ContentTypeField('category', 'Category', 'Text'))->setValidations((new ContentTypeValidation())->in(['Design', 'Development'])),
])
);
#####更新内容类型
$contentType = $managementSDK->contentTypes()
->find('CONTENT_TYPE_ID')
->get();
$contentType['fields'][0]['name'] = 'Post Title';
$result = $managementSDK->contentTypes()->put('CONTENT_TYPE_ID', $contentType);
#####发布内容类型
$contentType = $managementSDK->contentTypes()
->find('CONTENT_TYPE_ID')
->get();
$result = $managementSDK->contentTypes()->publish('CONTENT_TYPE_ID', $contentType);
#####取消发布内容类型
$contentType = $managementSDK->contentTypes()
->find('CONTENT_TYPE_ID')
->get();
$result = $managementSDK->contentTypes()->unpublish('CONTENT_TYPE_ID', $contentType);
#####删除内容类型
$result = $managementSDK->contentTypes()->delete('CONTENT_TYPE_ID');
#####内容类型负载数据构建器
#####内容类型字段负载数据构建器
#####内容类型字段验证负载数据构建器
不传递任何参数。
####条目
#####创建条目
$result = $managementSDK->entries()->contentType('CONTENT_TYPE_ID')->post(
new Entry([
new EntryField('title', 'Hello, World!'), //Create a field with only the default language
(new EntryField('body'))->addLanguage('en-US', 'Bacon is healthy!') //Add a language to a field.
])
);
请注意,您可以在不指定语言的情况下向字段添加内容。默认默认语言是 en-US。要指定不同的默认语言,请定义一个 CONTENTFUL_DEFAULT_LANGUAGE 常量。
示例
define('CONTENTFUL_DEFAULT_LANGUAGE', 'de-DE');
#####指定 ID 创建条目
$result = $managementSDK->entries()->put('MY_CUSTOM_ID',
new Entry([
new EntryField('title', 'Hello, World!'),
(new EntryField('body'))->addLanguage('en-US', 'Bacon is healthy!')
])
);
#####创建带有链接字段的条目
$result = $managementSDK->entries()->contentType('CONTENT_TYPE_ID')->post(new Entry([
new EntryField('title', 'Hello, World!'),
(new EntryField('body'))->addLanguage('en-US', 'Bacon is healthy!'),
(new EntryField('sidebar'))->addMultiLink('ENTRY_ID', 'Entry')->addMultiLink('ENTRY_ID', 'Entry'),
(new EntryField('author'))->addLink('ENTRY_ID', 'Entry')
]));
#####更新条目
$entry = $managementSDK->entries()
->find('ENTRY_ID')
->get();
$entry['fields']['title'] = new EntryField('title', 'Cheese is Healthy!');
$result = $managementSDK->entries()->put('ENTRY_ID', $entry);
#####发布条目
$entry = $managementSDK->entries()->find('ENTRY_ID')->get();
$result = $managementSDK->entries()->publish('ENTRY_ID', $entry);
#####取消发布条目
$entry = $managementSDK->entries()->find('ENTRY_ID')->get();
$result = $managementSDK->entries()->unpublish('ENTRY_ID', $entry);
#####存档条目
$result = $managementSDK->entries()->archive('ENTRY_ID');
#####取消存档条目
$result = $managementSDK->entries()->unarchive('ENTRY_ID');
#####删除条目
$result = $managementSDK->entries()->delete('ENTRY_ID');
#####条目负载数据构建器
#####条目字段负载数据构建器
####资产
#####创建资产
$result = $managementSDK->assets()->post(new Asset([
new AssetField('title', 'Bacon Pancakes'),
new File("image/jpeg", "example.jpg", "https://example.com/example.jpg")
])
);
#####指定 ID 创建资产
$result = $managementSDK->assets()->put('MY_CUSTOM_ID', new Asset([
new AssetField('title', 'Bacon Pancakes'),
new File("image/jpeg", "example.jpg", "https://example.com/example.jpg")
])
);
#####更新资产
$asset = $managementSDK->assets()->find('ASSET_ID')->get();
$asset['fields']['file'] = new File("image/jpeg", "example.jpg", "https://example.com/example.jpg");
$result = $managementSDK->assets()->put('ASSET_ID', $asset);
#####处理资产
$result = $managementSDK->assets()->process('ASSET_ID');
#####发布资产
$asset = $managementSDK->assets()->find('ASSET_ID')->get();
$result = $managementSDK->assets()->publish('ASSET_ID', $asset);
#####取消发布资产
$asset = $managementSDK->assets()->find('ASSET_ID')->get();
$result = $managementSDK->assets()->unpublish('ASSET_ID', $asset);
#####存档资产
$result = $managementSDK->assets()->archive('ASSET_ID');
#####取消存档资产
$result = $managementSDK->assets()->unarchive('ASSET_ID');
#####删除资产
$result = $managementSDK->assets()->delete('ASSET_ID');
#####资产负载数据构建器
#####资产字段负载数据构建器
#####文件负载数据构建器
####Webhooks
#####创建 Webhook
$result = $managementSDK->webhooks()->post(
new Webhook('http://www.example.com/')
);
#####更新 Webhook 或创建带有指定 ID 的新 Webhook
$result = $managementSDK->webhooks()->put('WEBHOOK_ID',
new Webhook('http://www.example.com/')
);
#####删除 Webhook
$result = $managementSDK->webhooks()->delete('WEBHOOK_ID');
#####Webhook 负载数据构建器
###未实现的功能?
- 同步.
- 预览 API.
- 组织.
###贡献
看到错别字或错误? 提交拉取请求。
有什么新功能? 提交拉取请求。
想要新功能却不知道如何实现? 你可以随时提出,如果我认为这是一个不错的想法,我可能会接受。
####你如何帮助我将会为我想实施的功能创建问题。如果我有计划亲自构建它们,我会给自己分配任务。如果它们没有被分配,请主动承担起来!