otis22 / vetmanager-rest-api
Vetmanager - 兽医CRM。这是一个方便与Vetmanager REST API协同工作的库。
0.1.11
2023-03-02 10:04 UTC
Requires
- php: >=7.3 || ^8.0
- ext-json: *
- elegant-bro/arrayee: ^0.1.0
- elegant-bro/interfaces: ^1.1
- elegant-bro/stringify: >=0.3.1
- otis22/php-interfaces: ^1.1
- otis22/vetmanager-token: ^0.2.0
Requires (Dev)
- guzzlehttp/guzzle: ^7.0
- otis22/php-coverage-checker: ^1.2
- otis22/vetmanager-url: ^0.3.0
- php-coveralls/php-coveralls: 1.0.1
- phpstan/phpstan: ^1.0
- phpunit/phpcov: ^8.0
- phpunit/phpunit: ^9.1
- squizlabs/php_codesniffer: 3.*
- symfony/deprecation-contracts: ^2.2
README
Vetmanager - 兽医CRM,支持REST API。vetmanager-rest-api是一个帮助处理REST API的库。
用途?
- 通过提供域名(可能更改主机)来获取完整URL
- 通过函数uri()验证模型名称
- 简化apiKey和token授权
- 排序、筛选等
- 从模型获取所有排序和筛选的记录
** 示例:获取client id=1或id=2的最新发票
use GuzzleHttp\Client; use function Otis22\VetmanagerUrl\url; use function Otis22\VetmanagerRestApi\uri; use function Otis22\VetmanagerRestApi\byApiKey; use Otis22\VetmanagerRestApi\Query\Builder; $client = new Client([ 'base_uri' => url("myclinic")->asString() ]); $top = (new Builder()) ->where('client_id', 'in', [1, 2]) ->orderBy('invoice_date', 'desc') ->top(1); $response = $client->request( 'GET', uri("invoice")->asString(), [ 'headers' => byApiKey("myapikey")->asKeyValue(), 'query' => $top->asKeyValue() ] );
警告! 函数 url
需要 "otis22/vetmanager-url" 包。
安装
composer require otis22/vetmanager-rest-api
用法
认证用法
API密钥认证
use Otis22\VetmanagerRestApi\Headers; use Otis22\VetmanagerRestApi\Headers\Auth\ApiKey; $client = new GuzzleHttp\Client(['base_uri' => 'http://some.vetmanager.ru']); $authHeaders = new Headers\WithAuth( new Headers\Auth\ByApiKey( new ApiKey('test-key') ) ); $client->request( 'GET', '/rest/api/user/1', ['headers' => $authHeaders->asKeyValue()] );
或使用函数
$authHeaders = Otis22\VetmanagerRestApi\byApiKey('test-key'); # use this after ['headers' => $authHeaders->asKeyValue()]
自定义时区
use Otis22\VetmanagerRestApi\Headers; use Otis22\VetmanagerRestApi\Headers\Auth\ApiKey; $myHeaders = [ 'X-REST-TIME-ZONE' => '+02:00' ]; $allHeaders = new Headers\WithAuthAndParams( new Headers\Auth\ByApiKey( new ApiKey('test-key') ), $myHeaders ); $client = new GuzzleHttp\Client(['base_uri' => 'http://some.vetmanager.ru']); $client->request( 'GET', '/rest/api/user/1', ['headers' => $allHeaders->asKeyValue()] );
Token认证
use Otis22\VetmanagerRestApi\Headers; use Otis22\VetmanagerToken; $authHeaders = new Headers\WithAuth( new Headers\Auth\ByToken( new Credentials\AppName("myapp"), new Token\Concrete("mytoken") ) ); $client = new GuzzleHttp\Client(['base_uri' => 'http://some.vetmanager.ru']); $client->request( 'GET', '/rest/api/user/1', ['headers' => $authHeaders->asKeyValue()] );
或使用函数
$authHeaders = Otis22\VetmanagerRestApi\byToken('myapp', 'mytoken'); # use this after ['headers' => $authHeaders->asKeyValue()]
服务API密钥认证
use Otis22\VetmanagerRestApi\Headers; use Otis22\VetmanagerRestApi\Headers\Auth\ServiceName; use Otis22\VetmanagerRestApi\Headers\Auth\ApiKey; $authHeaders = new Headers\WithAuth( new Headers\Auth\ByServiceApiKey( new ServiceName('name') new ApiKey('key') ) ); $client = new GuzzleHttp\Client(['base_uri' => 'http://some.vetmanager.ru']); $client->request( 'GET', '/rest/api/user/1', ['headers' => $authHeaders->asKeyValue()] );
或使用函数
$authHeaders = Otis22\VetmanagerRestApi\byServiceApiKey('service', 'api key'); # use this after ['headers' => $authHeaders->asKeyValue()]
创建有效URI的用法示例
仅模型
use Otis22\VetmanagerRestApi\URI; use Otis22\VetmanagerRestApi\Model; $uri = new URI\OnlyModel( new Model('invoice') ); $client = new GuzzleHttp\Client(['base_uri' => 'http://some.vetmanager.ru']); // request to /rest/api/invoice $client->request('GET', $uri->asString());
或使用函数
$uriString = \Otis22\VetmanagerRestApi\uri('invoice')->asString();
具有特定id的模型
use Otis22\VetmanagerRestApi\URI; use Otis22\VetmanagerRestApi\Model; $uri = new URI\WithId( new Model('invoice'), 5 ); $client = new GuzzleHttp\Client(['base_uri' => 'http://some.vetmanager.ru']); // request to /rest/api/invoice/5 $client->request('GET', $uri->asString());
或使用函数
$uriString = \Otis22\VetmanagerRestApi\uri('invoice', 5)->asString();
筛选和排序的用法示例
如何使用筛选器
use Otis22\VetmanagerRestApi\Query\Filters; use Otis22\VetmanagerRestApi\Query\Filter\EqualTo; use Otis22\VetmanagerRestApi\Model\Property; use Otis22\VetmanagerRestApi\Query\Filter\Value\StringValue; $filters = new Filters( new EqualTo( new Property('propertyName'), new StringValue('propertyValue') ) # ... we can use mach more filters new Filters($filterOne, $filterTwo, ... ); ); $client = new GuzzleHttp\Client(['base_uri' => 'http://some.vetmanager.ru']); $client->request( 'GET', '/rest/api/user/1', [ 'headers' => $authHeaders->asKeyValue(), 'query' => $filters->asKeyValue() ] );
完整的筛选器列表
- Otis22\VetmanagerRestApi\Query\Filter\EqualTo - 属性等于值
- Otis22\VetmanagerRestApi\Query\Filter\InArray - 属性在列表中
- Otis22\VetmanagerRestApi\Query\Filter\LessOrEqualThan - 属性小于等于值
- Otis22\VetmanagerRestApi\Query\Filter\LessThan - 属性小于值
- Otis22\VetmanagerRestApi\Query\Filter\Like - 属性类似于值(用于MySQL LIKE)
- Otis22\VetmanagerRestApi\Query\Filter\MoreOrEqualThan - 属性大于等于值
- Otis22\VetmanagerRestApi\Query\Filter\MoreThan - 属性大于值
- Otis22\VetmanagerRestApi\Query\Filter\NotEqualTo - 属性不等于值
- Otis22\VetmanagerRestApi\Query\Filter\NotInArray - 属性不在列表中
如何使用排序
use Otis22\VetmanagerRestApi\Query\Sorts; use Otis22\VetmanagerRestApi\Query\Sort\AscBy; use Otis22\VetmanagerRestApi\Query\Sort\DescBy; use Otis22\VetmanagerRestApi\Model\Property; $sorts = new Sorts( new AscBy( new Property('propertyName') ), new DescBy( new Property('property2Name') ) ); $client = new GuzzleHttp\Client(['base_uri' => 'http://some.vetmanager.ru']); $client->request( 'GET', '/rest/api/user/1', [ 'headers' => $authHeaders->asKeyValue(), 'query' => $sorts->asKeyValue() ] );
如何同时使用排序和筛选
use Otis22\VetmanagerRestApi\Query\Query; ... $query = new Query( new Filters(...), new Sorts(...) ); $client = new GuzzleHttp\Client(['base_uri' => 'http://some.vetmanager.ru']); $client->request( 'GET', '/rest/api/user/1', [ 'headers' => $authHeaders->asKeyValue(), 'query' => $query->asKeyValue() ] );
如何获取所有记录
$paged = PagedQuery::forGettingAll( new Query( // Sorts Required! ) ); $result = []; do { $response = json_decode( strval( $client->request( 'GET', uri('invoice')->asString(), [ 'headers' => $headers->asKeyValue(), 'query' => $paged->asKeyValue() ] )->getBody() ), true ); $paged = $paged->next(); $result = array_merge( $response['data']['invoice'], $result ); } while (count($result) < $response['data']['totalCount']);
如何获取前n条记录
$top1 = PagedQuery::forGettingTop( new Query( // Sorts Required! ), 1 ); $response = json_decode( strval( $client->request( 'GET', uri('invoice')->asString(), [ 'headers' => $headers->asKeyValue(), 'query' => $top1->asKeyValue() ] )->getBody() ), true );
查询构建器
top(n) - 返回PagedQuery实例,通过用户筛选和排序顺序获取前n条记录。
$top = (new Builder()) ->where('client_id', 'in', [1, 2]) ->orderBy('id', 'desc') ->top(1);
paginateAll(): 返回PagedQuery实例,通过用户筛选和排序顺序获取所有记录
$paginateAll = (new Builder()) ->where('client_id', 'in', [1, 2]) ->orderBy('id', 'desc') ->paginateAll();
paginate(limit, offset): 返回PagedQuery实例,通过用户筛选和排序顺序获取自定义限制和偏移的记录
$paginate = (new Builder()) ->where('client_id', 'in', [1, 2]) ->orderBy('id', 'desc') ->paginate(10, 20);
您可以使用筛选器类字符串操作符代替。
use Otis22\VetmanagerRestApi\Query\Filter; (new Builder()) ->where('client_id', Filter\InArray::class, [1, 2]) ->where('pet_id', Filter\NotEqualTo::class, 5)
贡献
运行所有测试
make all
连接到终端
make exec
默认PHP版本是8.1。使用PHP_VERSION=使用您的版本。目前只有8.0和8.1版本可用。
make all PHP_VERSION=8.0 # run both make all PHP_VERSION=8.0 && make all PHP_VERSION=8.1
对于集成测试,将.env.example复制到.env并填写您的值
所有命令
# security check make security # composer install make install # composer install with --no-dev make install-no-dev # check code style make style # run static analyze tools make static-analyze # run unit tests make unit # check coverage make coverage # check integration, .env required make integration