knock-knock

Facade for PHP requests on cURL

Downloads
42
Stars
1
Committers
2

KnockKnock - , PHP, cURL. , API .

: .

P.S. : Guzzle, Client ( Yii2), . "" , , nullWarningStyle - , : , , . _, , - _

:


  • php 8.0
  • ext cURL
  • ext JSON

  • composer, :
composer require andy87/knockknock
  • composer.phar:
php composer.phar require andy87/knockknock

: composer update

composer.json , require "andy87/knockknock": "*" : composer update

, , :

require_once '////autoload.php';

:

  • , autoload.php .

.

use andy87\knock_knock\lib\Method;
use andy87\knock_knock\lib\ContentType;
use andy87\knock_knock\core\Operator;
use andy87\knock_knock\core\Response;

//     
$operator = new Operator( $_ENV['API_HOST'] )->disableSSL();  

/**
 *    (    ) 
 */
$content = $operator->send( $operator->constructRequest(Method::GET, 'info/me') )->content;

/** 
 *      
 */
$request = $operator->constructRequest(Method::GET, 'info/me'); //   
$request->setCurlInfo([ CURLINFO_CONTENT_TYPE ]); //   cURL
$response = $operator->send($request); //     

$content = $response->content; //   
$curlOptions = $response->request->curlOptions; //   cURL

$output = ( $curlOptions[CURLINFO_CONTENT_TYPE] === ContentType::JSON ) ? json_decode( $content ) : $content;

print_r( $output );


use andy87\knock_knock\core\Operator;

PHP \ ext cURL

  • commonRequest
    • _ , _
  • realRequest
    • _ _
  • eventHandlers
    • _ _
  • host
    • _, _
  • logs
    • _ _

/:

  • Singleton

!

  • , ReadOnly .
  • CURL_OPTIONS ! , , .
:
$operator = new Operator( $_ENV['API_HOST'], $commonRequestParams );

, Singleton:

$operator = Operator::getInstance( $_ENV['API_HOST'], $commonRequestParams );

( Operator), :

  • string $host -

  • array $operatorConfig - .

    Operator init(), . init() EVENT_AFTER_CONSTRUCT

:

//     
$commonRequestParams = [
    Request::SETUP_PROTOCO => $_ENV['API_PROTOCOL'],
    Request::SETUP_CONTENT_TYPE => Request::CONTENT_TYPE_JSON,
    Request::SETUP_CURL_OPTIONS => [
        CURLOPT_HEADER => false,
        CURLOPT_RETURNTRANSFER => true
    ]
];
//     
$operator = new Operator( $_ENV['API_HOST'], $commonRequestParams );

//,  Singleton:
$operator = Operator::getInstance( $_ENV['API_HOST'], $commonRequestParams );

( Request):

  • SETUP_PROTOCOL
  • SETUP_HOST
  • SETUP_METHOD
  • SETUP_HEADERS
  • SETUP_CONTENT_TYPE
  • SETUP_DATA
  • SETUP_CURL_OPTIONS
  • SETUP_CURL_INFO
  • EVENT_AFTER_CONSTRUCT knockKnock
  • EVENT_CREATE_REQUEST
  • EVENT_BEFORE_SEND
  • EVENT_CURL_Operator curl
  • EVENT_CREATE_RESPONSE
  • EVENT_AFTER_SEND
$operator->setupEventHandlers([
    Operator::EVENT_AFTER_CONSTRUCT => function( Operator $operator ) {
        // ...
    },
    Operator::EVENT_CREATE_REQUEST => function( Operator $operator, Request $request ) {
        // ...
    },
    Operator::EVENT_BEFORE_SEND => function( Operator $operator, Request $request ) {
        // ...
    },
    Operator::EVENT_CURL_HANDLER => function( Operator $operator, resource $ch ) {
        // ...
    },
    Operator::EVENT_CREATE_RESPONSE => function( Operator $operator, Response $response ) {
        // ...
    },
    Operator::EVENT_AFTER_SEND => function( Operator $operator, Response $response ) {
        // ...
    }
]);
  • , - callback .

callback / Operaotr. / :

  • Request - EVENT_CREATE_REQUEST, EVENT_BEFORE_SEND
  • Response - EVENT_CREATE_RESPONSE, EVENT_AFTER_SEND

use andy87\knock_knock\core\Request;

, .

  • protocol - __
  • host - __
  • endpoint - _ _
  • method - __
  • headers - __
  • contentType - _ _
  • data - __
  • curlOptions - _ cURL_
  • curlInfo - _ cURL_
  • params - _ _
  • url - _ URL_
  • params - _ _
  • fakeResponse - _ _
  • errors - _ _
:
$request = new Request( 'info/me', [
    Request::METHOD => Method::POST,
    Request::DATA => [ 'client_id' => 34 ],
    Request::HEADERS => [ 'api-secret-key' => $_ENV['API_SECRET_KEY'] ],
    Request::CURL_OPTIONS => [ CURLOPT_TIMEOUT => 10 ],
    Request::CURL_INFO => [
        CURLINFO_CONTENT_TYPE,
        CURLINFO_HEADER_SIZE,
        CURLINFO_TOTAL_TIME
    ],
    Request::CONTENT_TYPE => ContentType::FORM_DATA,
]);

, callback , EVENT_CREATE_REQUEST

$request = $operator->constructRequest(Method::GET, 'info/me', [
    Request::METHOD => Method::POST,
    Request::DATA => [ 'client_id' => 45 ],
    Request::HEADERS => [ 'api-secret-key' => $_ENV['API_SECRET_KEY'] ],
    Request::CURL_OPTIONS => [ CURLOPT_TIMEOUT => 10 ],
    Request::CURL_INFO => [
        CURLINFO_CONTENT_TYPE,
        CURLINFO_HEADER_SIZE,
        CURLINFO_TOTAL_TIME
    ],
    Request::CONTENT_TYPE => ContentType::FORM_DATA,
]);

:

$request = $operator->constructRequest(Method::GET, 'info/me');

$response = $operator->send($request);

//   (  )
$cloneRequest = $request->clone();

//   
$response = $operator->setupRequest( $cloneRequest )->send();

set/get

setProtocol( string $protocol ) getProtocol(): string
setHost( string $host ) getHost(): string ---
Endpoint setEndpoint( string $url ) getEndpoint(): string ---
setMethod( string $method ) getMethod(): string
setHeaders( array $headers ) getHeaders(): array
setContentType( string $contentType ) getContentType(): string
setData( mixed $data ) getData(): mixed ---
cURL setCurlOptions( array $curlOptions ) getCurlOptions(): array cURL
cURL setCurlInfo( array $curlInfo ) getCurlInfo(): array cURL
setFakeResponse( array $response ) getFakeResponse(): array
$request = $operator->constructRequest(Method::GET, 'info/me');

$request->setMethod( Method::GET );
$request->setData(['client_id' => 67]);
$request->setHeaders(['api-secret-key' => 'secretKey67']);
$request->setCurlOptions([
    CURLOPT_TIMEOUT => 10,
    CURLOPT_RETURNTRANSFER => true
]);
$request->setCurlInfo([
    CURLINFO_CONTENT_TYPE,
    CURLINFO_HEADER_SIZE,
    CURLINFO_TOTAL_TIME
]);
$request->setContentType( ContentType::JSON );

$protocol = $request->getPrococol(); // String
$host = $request->getHost(); // String
// ...           
$operator->setupRequest( $request, [
    Request::SETUP_HOST => $_ENV['API_HOST'],
    Request::SETUP_HEADERS => [
        'api-secret' => $_ENV['API_SECRET_KEY']
    ],
]);

setupRequest( Request $request, array $options = [] ): self

addError( string $error )
$request = $operator->constructRequest(Method::GET, 'info/me');

$request->addError('!');


use andy87\knock_knock\core\Response;

, .

  • content
    • _ _
  • httpCode
    • _ _
  • request
    • _ , _
  • curlOptions
    • _ request->curlOptions_
  • curlInfo
    • _ request->curlInfo_
:
$response = new Response('{"id" => 806034, "name" => "and_y87"}', 200 );

, callback , EVENT_CREATE_RESPONSE

$response = $operator->constructResponse([
    Response::CONTENT => [
        'id' => 806034,
        'name' => 'and_y87'
    ],
    Response::HTTP_CODE => 400,
], $request );

constructResponse( array $responseParams, ?Request $request = null ): Response

send( ?Request $request = null ): Response / Response. callback , :

  • EVENT_AFTER_SEND
  • EVENT_CREATE_RESPONSE
  • EVENT_BEFORE_SEND
  • EVENT_CURL_HANDLER
$operator = new Operator( $_ENV['API_HOST'] );
$request = $operator->constructRequest(Method::GET, 'info/me');
$response = $operator->send($request);

// 
$operator = new Operator( $_ENV['API_HOST'] );
$response = $operator->send( $operator->constructRequest(Method::GET, 'info/me') );

, RequestCompleteException. , :

$operator = new Operator( $_ENV['API_HOST'] );
$request = $operator->constructRequest(Method::GET, 'info/me');
$response = $operator->send($request);

//   
$response = $operator->send($request->clone());
//   
$fakeResponse = [
    Response::HTTP_CODE => 200,
    Response::CONTENT => '{"id" => 8060345, "nickName" => "and_y87"}'
];
$request->setFakeResponse( $fakeResponse );

$response = $operator->send( $request );

$response content, httpCode $fakeResponse

Response, , , set.

$response = $operator->send($request);

$response
    ->setHttpCode(200)
    ->setContent('{"id" => 8060345, "nickName" => "and_y87"}');

! , ParamUpdateException. , replace( string $key, mixed $value ) .

$response = $operator->send($request);

$response
    ->replace( Response::HTTP_CODE, 200 )
    ->replace( Response::CONTENT, '{"id" => 8060345, "nickName" => "and_y87"}' );
`Response`  ,    ReadOnly  `request`  
   `Request`    
$operator = new Operator( $_ENV['API_HOST'] );
$response = $operator->setRequest( $operator->constructRequest(Method::GET, 'info/me') )->send();

//   
$request = $response->request;

$method = $request->method; //   

cURL

$operator = new Operator( $_ENV['API_HOST'] );
$response = $operator->setRequest( $operator->constructRequest(Method::GET, 'info/me') )->send();

$response->request;

//     
$curlOptions =  $response->request->curlOption;
$curlInfo =  $response->request->curlInfo;

//    
$curlOptions =  $response->curlOption;
$curlInfo =  $response->curlInfo;

.

  •  `asArray()`
    
  •  `asArray(true)`
    
$response = $operator->send($request)->asArray(); // $response
$array = $response->content; // Array$response
addError( string $error )
$request = $operator->constructRequest(Method::GET, 'info/me');

$response = $operator->send($request);

$response->addError('!');


/ SSL Operaotr & Request.

curlOptions CURLOPT_SSL_VERIFYPEER CURLOPT_SSL_VERIFYHOST.

->disableSSL( bool $verifyPeer = false, int $verifyHost = 0 ); ->enableSSL( bool $verifyPeer = true, int $verifyHost = 2 );

Operaotr -

$operator = new Operator( $_ENV['API_HOST'] );
$operator->disableSSL();

$request = $operator->constructRequest(Method::GET, 'info/me');

$response = $operator->setupRequest( $request )->send();

Request -

$operator = new Operator( $_ENV['API_HOST'] )->disableSSL();

$request = $operator->constructRequest(Method::GET, 'info/me');
$request->enableSSL();

$response = $operator->setupRequest( $request )->send();

Operaotr cookie. Operaotr -

$operator = new Operator( $_ENV['API_HOST'] );

$cookie = $_ENV['COOKIE'];
$jar = $_ENV['COOKIE_JAR'];

$operator->useCookie( $cookie, $jar );

$operator->useCookie( string $cookie, string $jar, ?string $file = null ) $file = null $file $jar

 `logs` 
$operator = new Operator( $_ENV['API_HOST'] );

$operator->addLog( '  ' );

$operator->addLog( string $message )


get() post() put() patch() delete() head() options() trace()
$endpoint string URL ( )
$params array
_P.S. host _
$knockKnockOctopus = new KnockKnockOctopus($_ENV['API_URL']);

$knockKnockOctopus->get( '/profile', [ 'id' => 806034 ] ); //GET 

$knockKnockOctopus->post( '/new', [  //POST 
    'name' => ' ',
    'content' => ' ' 
]);

KnockKnockOctopus, , .

$knockKnockSecurity = new KnockKnockSecurity($_ENV['API_URL']);

//     
$knockKnockSecurity
    ->disableSSL()
    ->setupAuthorization( KnockKnockSecurity::TOKEN_BEARER, 'token' )
    ->setupHeaders([ 'X-Api-Key' => $_ENV['X_API_KEY'] ])
    ->setupContentType( ContentType::JSON )
    ->on( Operator::EVENT_AFTER_SEND, function( Operator $operator, Response $response ) => 
    {
        $logFilePath = $_SERVER['DOCUMENT_ROOT'] . '/api_log.txt';

        file_put_contents( $logFilePath, $response->content, FILE_APPEND );
    });

//      `patch`
$responsePatch = $knockKnockSecurity->patch( 'product', [
    'price' => 1000
]);

$product = $responsePatch->asArray();

$price = $product['price'];

//     `application/json`,   
$knockKnockSecurity->useContentType( ContentType::JSON );

//  POST    
$responsePost = $knockKnockSecurity->post( 'category', [
    'name' => ''
]);

$response = json_decode( $responsePost->content );

$category_id = $response->id;


Custom , " "

class KnockKnockYandex extends Operator
{
    private const LOGGER = 'logger';


    private string $host = 'https://api.yandex.ru/'

    private string $contentType = ContentType::JSON

    private YandexLogger $logger;



    /**
     * @return void
     */
    public function init(): void
    {
        $this->setupYandexLoggerEventHandlers();
    }
    
    /**
     * @param array $callbacks
     * 
     * @return self
     */
    private function setupYandexLoggerEventHandlers( array $callbacks ): self
    {
        $this->on( self::AFTER_CREATE_REQUEST, function( Request $request ) => 
        {
            $logData = $this->getLogDataByRequest( $request );

            $this->addYandexLog( $logData );
        };

        $this->on(self::EVENT_AFTER_SEND, function( Response $response ) => 
        {
            $logData = $this->getLogDataByRequest( $response->request );

            $this->addYandexLog( $logData );
        };
    }

    /**
      * @param Request $request
      * 
      * @return array
      */
    private function getLogDataByRequest( Request $request ): array
    {
        return $request->getParams();
    }

    /**
     * @param array $logData
     * 
     * @return void
     */
    private function addYandexLog( array $logData ): bool
    {
        return $logger->log( $logData );
    }
}


$knockKnockYandex = KnockKnockYandex::getInstane( $_ENV['API_HOST'], [
    KnockKnockYandex::LOGGER => new YandexLogger(),
]);

$response = $knockKnockYandex->setupRequest( 'profile', [ 
    Request::METHOD => Method::PATCH,
    Request::DATA => [ 'city' => 'Moscow' ],
]); //  `afterCreateRequest`

$response = $knockKnockYandex->send(); //  `afterSend`

  • tests: 100+
  • assertions: 350+
vendor/bin/phpunit
vendor/bin/phpunit --testdox
vendor/bin/phpunit --log-junit "tests/logs/phpunit.xml"

https://github.com/andy87/KnockKnock CC BY-SA 4.0 http://creativecommons.org/licenses/by-sa/4.0/

Packagist