- PHP 7.4 or 8.x
- HTTP client(this readme describes Guzzle example, but you can use any other PSR18 complaint package). Check these packages https://packagist.org/providers/psr/http-client-implementation if you need Guzzle alternative.
Installation via Composer
Run in command line:
composer require ybelenko/dtf-dbs-client
Via PHP-DI container
<?php
// config.dev.php
// contains sensitive data
// should be excluded from source base in .gitignore file
return [
'DtfDbsApi.dealerId' => 'test01',
'DtfDbsApi.clientId' => 'xxxxxxxxxxxxxxxxx',
'DtfDbsApi.clientSecret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'DtfDbsApi.environment' => 'cert',// cert|qual|prod
];
<?php
// config.php
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\HttpFactory;
use GuzzleHttp\RequestOptions;
use Psr\Http\Client\ClientInterface;
use Ybelenko\DtfDbsClient\ApiClient;
use Ybelenko\DtfDbsClient\ApiClientConfig;
return [
// Guzzle Client with DTF DBS API
ClientInterface::class => \DI\autowire(Client::class)
->constructor([
RequestOptions::HTTP_ERRORS => false,// important to handle non 2xx statuses properly
]),
ApiClient::class => \DI\autowire(),
ApiClientConfig::class => \DI\autowire()
->constructorParameter('requestFactory', \DI\create(HttpFactory::class))
->constructorParameter('uriFactory', \DI\create(HttpFactory::class))
->constructorParameter('streamFactory', \DI\create(HttpFactory::class))
->constructorParameter('dealerId', \DI\get('DtfDbsApi.dealerId'))
->constructorParameter('clientId', \DI\get('DtfDbsApi.clientId'))
->constructorParameter('clientSecret', \DI\get('DtfDbsApi.clientSecret'))
->constructorParameter('environment', \DI\get('DtfDbsApi.environment'))
->constructorParameter('authScope', 'dtf:dbs:file:write dtf:dbs:file:read'),
];
<?php
// index.php
require_once(__DIR__ . '/vendor/autoload.php');
use DI\ContainerBuilder;
use Psr\Container\ContainerInterface;
$builder = new ContainerBuilder();
// Main configuration
$builder->addDefinitions("config.php");
// Config file for the environment
$builder->addDefinitions("config.$environment.php");
/** @var ContainerInterface */
$container = $builder->build();
<?php
// index.php
require_once(__DIR__ . '/vendor/autoload.php');
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\HttpFactory;
use GuzzleHttp\RequestOptions;
use Ybelenko\DtfDbsClient\ApiClient;
use Ybelenko\DtfDbsClient\ApiClientConfig;
$client = new ApiClient(
new ApiClientConfig(
new Client([RequestOptions::HTTP_ERRORS => false]),// httpClient
new HttpFactory(),// requestFactory
new HttpFactory(),// uriFactory
new HttpFactory(),// streamFactory
'xxxxxxxxxxxxxxxxx',// clientId
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',// clientSecret
'test01',// dealerId
'cert',// environment cert|qual|prod
'dtf:dbs:file:write dtf:dbs:file:read'// scopes
)
);
// ready to call API services
// $client initialization omitted
try {
/** @var array[] */
$filesList = $client->callFileListService();
// Approx shape [{"name": "order.dat", "links": [{"rel": "download", "href": "http:"}, {"rel": "details", "href": "http:"}]}, ...]
foreach ($filesList as $file) {
// do something
}
} catch (\Throwable $e) {
// echo or log exception for following investigation
}
// $client initialization omitted
try {
$factory = new \GuzzleHttp\Psr7\HttpFactory();
$testFile = $factory->createStreamFromFile(__DIR__ . '/tests/samplecommonfile.txt', 'r');
/** @var bool */
$success = $client->callFileUploadService(
$testFile,
null,// filename, optional
true// overwrite param
);
if (!$success) {
throw new \Exception('Unable to upload file');
}
} catch (\Throwable $e) {
// echo or log exception for following investigation
}
// $client initialization omitted
try {
// can be retrieved from File List Service above
$filename = 'samplecommonfile.txt';
/** @var \Psr\Http\Message\StreamInterface */
$fileStream = $client->callFileDownloadService($filename);
$uploaded = new \GuzzleHttp\Psr7\UploadedFile($fileStream, $fileStream->getSize(), \UPLOAD_ERR_OK, $filename);
$uploaded->moveTo(__DIR__ . '\/output\/' . $filename);
// saved to output folder
} catch (\Throwable $e) {
// echo or log exception for following investigation
}