qurbanali / zendesk-php
使用此PHP API包装器轻松地与Zendesk REST API协同工作。简化集成并增强功能。
Requires
- php: 7.4.0|^8.0|^8.1
- guzzlehttp/guzzle: ^7.2
- guzzlehttp/psr7: ^1.7 || ^2.0
- mmucklo/inflect: 0.3.*
Requires (Dev)
- phpstan/phpstan: ^1.10
README
此客户端 仅 支持 Zendesk 的 API v2。请参阅我们的 API 文档 以获取更多信息。
需求
- PHP 7.4+
安装
可以使用 Composer 安装 Zendesk PHP API 客户端。
Composer
要安装,请运行 composer require qurbanali/zendesk-php
配置
配置是通过 Qurban\ZendeskAPI\HttpClient
实例完成的。此块是必需的,如果不传递,则会抛出错误。
// load Composer require 'vendor/autoload.php'; use Qurban\ZendeskAPI\HttpClient as ZendeskAPI; $subdomain = "subdomain"; $username = "email@example.com"; // replace this with your registered email $token = "6wiIBWbGkBMo1mRDMuVwkw1EPsNkeUj95PIz2akv"; // replace this with your token $client = new ZendeskAPI($subdomain); $client->setAuth('basic', ['username' => $username, 'token' => $token]);
用法
基本操作
// Get all tickets $tickets = $client->tickets()->findAll(); echo $tickets; // Get all tickets regarding a specific user. $tickets = $client->users($requesterId)->tickets()->requested(); echo $tickets; // Create a new ticket $newTicket = $client->tickets()->create([ 'subject' => 'The quick brown fox jumps over the lazy dog', 'comment' => [ 'body' => 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, ' . 'sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.' ], 'priority' => 'normal' ]); echo $newTicket; // Update a ticket $client->tickets()->update(123,[ 'priority' => 'high' ]); // Delete a ticket $client->tickets()->delete(123); // Get all users $users = $client->users()->findAll(); echo $users;
附件
$attachment = $client->attachments()->upload([ 'file' => getcwd().'/tests/assets/UK.png', 'type' => 'image/png', 'name' => 'UK.png' // Optional parameter, will default to filename.ext ]);
将文件附加到评论
$ticket = $client->tickets()->create([ 'subject' => 'The quick brown fox jumps over the lazy dog', 'comment' => [ 'body' => 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, ' . 'sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', 'uploads' => [$attachment->upload->token] ] ]);
边加载
边加载允许您将相关记录作为单个请求的一部分检索。有关更多信息,请参阅[文档]。(https://developer.zendesk.com/rest_api/docs/core/side_loading)。
以下是一个使用客户端进行边加载的示例。
$tickets = $client->tickets()->sideload(['users', 'groups'])->findAll();
分页
如 findAll()
之类的分页方法在没有任何分页参数的情况下调用API。如果端点支持分页,则仅返回第一页。要获取所有资源,您需要多次调用API。
迭代器(推荐)
使用迭代器封装正确的分页类型,这允许您在不考虑分页的情况下检索所有资源,从而进行多次API调用。
$iterator = $client->tickets()->iterator(); foreach ($iterator as $ticket) { echo($ticket->id . " "); }
如果您想要特定的排序顺序,请参阅文档中的排序部分(例如[票据])。
带参数的迭代器示例
$params = ['my' => 'param1', 'extra' => 'param2']; $iterator = $client->tickets()->iterator($params); foreach ($iterator as $ticket) { echo($ticket->id . " "); }
- 使用以下方式更改页面大小:
$params = ['page[size]' => 5];
- 使用以下方式更改排序:
$params = ['sort' => '-updated_at'];
- 请参阅文档以获取详细信息,包括允许的排序字段
- 组合一切:
$params = ['page[size]' => 2, 'sort' => 'updated_at', 'extra' => 'param'];
注意:
- 请参阅文档以获取您所使用的分页类型中用于排序的正确参数
- 辅助方法
iterator_to_array
不适用于此实现
迭代器 API 调用响应
最新响应在迭代器的 $iterator->latestResponse()
中公开。这可能会很有用,用于调试。
自定义迭代器
如果您想使用迭代器进行自定义方法,而不是默认的 findAll()
,则可以为您的集合创建一个迭代器
$strategy = new CbpStrategy( // Or ObpStrategy or SinglePageStrategy "resources_key", // The root key with resources in the response, usually plural and in underscore [], // Extra params for your call ); $iterator = PaginationIterator($client->tickets(), $strategy); foreach ($ticketsIterator as $ticket) { // Use as normal }
这对于像 活动自动化 这样的筛选端点很有用。然而,在这个常见的案例中,您只需要将方法从 findAll()
更改为 findActive()
,有一个更好的快捷方式
$iterator = $client->automations()->iterator($params, 'findActive');
这类似于
use Qurban\ZendeskAPI\Traits\Utility\Pagination\PaginationIterator; use Qurban\ZendeskAPI\Traits\Utility\Pagination\CbpStrategy; $strategy = new CbpStrategy('automations', $params); $iterator = new PaginationIterator( $client->automations(), $strategy, 'findActive' );
如果您需要更多的自定义实现,请参阅 分页特质 的使用。
捕获 API 错误
这并没有太多变化
try { foreach ($iterator as $ticket) { // your code } } catch (ApiResponseException $e) { $errorMessage = $e->getMessage(); $errorDetails = $e=>getErrorDetails(); }
如果您需要知道在哪个位置出现错误,您可以将所需信息存储在代码中的循环内部。
使用CBP进行FindAll(良好)
如果您仍然想使用findAll()
,直到CBP成为默认API响应,您必须通过使用page[size]
参数显式请求CBP响应。
// CBP: /path?page[size]=100 $response = $client->tickets()->findAll(['page[size]' => 100]); process($response->tickets); // Your implementation do { if ($response->meta->has_more) { // CBP: /path?page[after]=cursor $response = $client->tickets()->findAll(['page[after]' => $response->meta->after_cursor]); process($response->tickets); } } while ($response->meta->has_more);
立即处理数据。这优化了内存使用,实现了实时处理,并有助于遵守API速率限制,提高效率和用户体验。
使用OBP进行Find All(仅在端点不支持CBP时推荐使用)
如果CBP不可用,这是如何一次获取一页的示例
$pageSize = 100; $pageNumber = 1; do { // OBP: /path?per_page=100&page=2 $response = $client->tickets()->findAll(['per_page' => $pageSize, 'page' => $pageNumber]); process($response->tickets); // Your implementation $pageNumber++; } while (count($response->tickets) == $pageSize);
立即处理数据。这优化了内存使用,实现了实时处理,并有助于遵守API速率限制,提高效率和用户体验。
重试请求
在您的GuzzleHttp\Client
实例的HandlerStack
上添加RetryHandler
中间件。默认情况下,Qurban\ZendeskAPI\HttpClient
会重试
- 超时请求
- 那些抛出
Psr\Http\Message\RequestInterface\ConnectException:class
异常的请求 - 以及那些抛出被识别为ssl问题的
Psr\Http\Message\RequestInterface\RequestException:class
异常。
可用选项
选项以值数组的形式传递给RetryHandler
。
- max = 2 重试次数限制
- interval = 300 重试之间的基础延迟(毫秒)
- max_interval = 20000 最大延迟值
- backoff_factor = 1 退避因子
- exceptions = [ConnectException::class] 不需要检查retry_if的重试异常
- retry_if = null 可调用函数,可以决定是否重试请求
贡献
欢迎提交Pull Requests,但在发送之前,请阅读我们的贡献指南。这将加快流程并确保每个人遵循社区标准。
打印HTTP客户端API调用
您可以使用以下命令打印每个API调用的详细信息:
$client = new ZendeskAPI($subdomain); $client->log_api_calls = true;