zendesk/zendesk_api_client_php

Zendesk REST API的PHP客户端。请参阅https://developer.zendesk.com/rest_api/docs/core/introduction。


README

CI Latest Stable Version Total Downloads Code Climate License

API客户端版本

这是我们的PHP API客户端的第二个版本。旧版本的API客户端可以在v1分支上找到。

API版本支持

此客户端仅支持Zendesk的API v2。有关更多信息,请参阅我们的API文档

需求

  • PHP 7.4+

安装

可以使用Composer安装Zendesk PHP API客户端。

Composer

要安装,请运行composer require zendesk/zendesk_api_client_php

从V1升级到V2

如果您正在将客户端从v1升级,我们编写了升级指南,突出显示了一些关键差异。

配置

配置是通过Zendesk\API\HttpClient的一个实例来完成的。该块是必需的,如果不传递,将抛出错误。

// load Composer
require 'vendor/autoload.php';

use Zendesk\API\HttpClient as ZendeskAPI;

$subdomain = "subdomain";
$username  = "[email protected]"; // 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();
print_r($tickets);

// Get all tickets regarding a specific user.
$tickets = $client->users($requesterId)->tickets()->requested();
print_r($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'
]);
print_r($newTicket);

// Update a ticket
$client->tickets()->update(123,[
    'priority' => 'high'
]);

// Delete a ticket
$client->tickets()->delete(123);

// Get all users
$users = $client->users()->findAll();
print_r($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)。(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 Zendesk\API\Traits\Utility\Pagination\PaginationIterator;
use Zendesk\API\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查找所有内容(仅在端点不支持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中间件。默认情况下,Zendesk\Api\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 可以决定是否重试请求的可调用函数

贡献

我们总是欢迎拉取请求,但在您发送之前,请阅读我们的贡献指南。这会加快流程,并确保每个人都遵循社区的标准。

调试

REPL

为了帮助贡献者,我们添加了一个REPL工具。这是一个对psysh和symfony控制台的简单封装。在您的终端中,运行bin/console <subdomain> <email> <api token>。这将在变量$client上自动创建一个Zendesk\API\HttpClient实例。之后,您就可以输入任何有效的PHP语句了。这个工具的目标是加快开发者对代码库进行实验的过程。

打印HTTP客户端API调用

您可以使用以下方式打印有关每个API调用的详细信息

$client = new ZendeskAPI($subdomain);
$client->log_api_calls = true;

HTTP客户端调试

您可以通过此对象检查请求和响应的信息

$client->getDebug();

版权和许可

版权 2013-至今 Zendesk

根据Apache License 2.0(“许可证”)许可;除非遵守许可证,否则不得使用此文件。您可以在以下位置获得许可证副本:

http://www.apache.org/licenses/LICENSE-2.0

除非适用法律要求或书面同意,否则在许可证下分发的软件按“原样”提供,不提供任何明示或暗示的保证或条件。有关许可证的具体语言管理权限和限制,请参阅许可证。