Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/pinkeen/apidebugbundle
Provides web debug toolbar tab for easy API call debugging (Guzzle6 support).
https://github.com/pinkeen/apidebugbundle
Last synced: 14 days ago
JSON representation
Provides web debug toolbar tab for easy API call debugging (Guzzle6 support).
- Host: GitHub
- URL: https://github.com/pinkeen/apidebugbundle
- Owner: pinkeen
- Created: 2014-03-30T15:00:47.000Z (almost 11 years ago)
- Default Branch: master
- Last Pushed: 2019-03-01T13:15:28.000Z (almost 6 years ago)
- Last Synced: 2024-11-15T13:41:04.158Z (about 2 months ago)
- Language: PHP
- Homepage:
- Size: 114 KB
- Stars: 1
- Watchers: 2
- Forks: 1
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
ApiDebugBundle
==============![ApiDebugBundle in action](Resources/doc/meta/images/apidebug.png)
This bundle adds a web debug toolbar tab which displays information about API consumer requests.
It aims to be universal and allow for easy integration with SDKs and HTTP client libraries.
Currently it supports [Guzzle 6](https://github.com/guzzle/guzzle) out-of-the box.
It should be extremely easy to integrate with any http client using PSR-7 messages.
For `Guzzle4`-compatible version use the `v1.0` tag.
For `Symfony < 3.3`-compatible version use the `v2.0` tag.
## Requirements
* PHP 5.5.9
* Symfony 3.3## Installation
The usual [Symfony stuff](http://symfony.com/doc/current/cookbook/bundles/installation.html).
The **composer.json** needs: `"pinkeen/api-debug-bundle": "dev-master",`.
The **AppKernel.php** needs: `new Pinkeen\ApiDebugBundle\PinkeenApiDebugBundle(),`.
Add the following to your `app/config/routing_dev.yml` if you want to be able to view raw body data:
```yml
_api_debug:
resource: "@PinkeenApiDebugBundle/Resources/config/routing.yml"
prefix: /_profiler
```## Services
### New symfony approach
All services expect GuzzleClientFactory and RingPHPHandlerFactory are private,
which means you cannot fetch services directly from the container via $container->get().They are also automatically registered and set to autowire,
all you need to do add type-hinted service to your class as an argument of contructor.```php
// src/AppBundle/Service/FooService.php
// ...use Pinkeen\ApiDebugBundle\Bridge\Guzzle\Middleware\DataCollectorMiddleware;
class FooService
{
private $dataCollectorMiddleware;public function __construct(DataCollectorMiddleware $dataCollectorMiddleware)
{
$this->dataCollectorMiddleware = $dataCollectorMiddleware;
}// ...
}
```## Usage
### Integrate with your custom client
Firstly you have to subclass
[`AbstractCallData`](DataCollector/AbstractCallData.php)
which holds data from a single API request.If you are using a PSR-7 comptible client then you can use [`PsrCallData`](DataCollector\Data\PsrCallData.php)
instead of writing your own data class.Then every time your API consumer makes a request dispatch an [`ApiEvents::API_CALL`](ApiEvents.php) event.
```php
use Pinkeen\ApiDebugBundle\ApiEvents;
use Pinkeen\ApiDebugBundle\Event\ApiCallEvent;
/* ... */
/** @var $eventDispatcher \Symfony\Component\EventDispatcher\EventDispatcher */
$eventDispatcher->dispatch(
ApiEvents::API_CALL,
new ApiCallEvent(
new YourApiCallData(/* your params */)
)
);
```### Guzzle
You've got two options here, either:
*Let the bundle create the client for you...*
```php
/** @var $guzzleClientFactory \Pinkeen\ApiDebugBundle\Bridge\Guzzle\Service\GuzzleClientFactory */
$guzzleClientFactory->create([
/* Guzzle client config (optional).
* It is passed directly to GuzzleHttp\Client constructor. */
]);
```*... or push the collector handler to your middleware stack.*
```php
$handler = new GuzzleHttp\HandlerStack(new GuzzleHttp\Handler\CurlHandler());
/** @var $dataCollectorMiddleware \Pinkeen\ApiDebugBundle\Bridge\Guzzle\Middleware\DataCollectorMiddleware */
$dataCollectorMiddlewareHandler = $dataCollectorMiddleware->getHandler();
$handler->push($dataCollectorMiddlewareHandler);
$client = new GuzzleHttp\Client(['handler' => $handler]);
```### RingPHP
*Let the bundle create the handler for you:*
```php
/** @var $ringPHPHandlerFactory \Pinkeen\ApiDebugBundle\Bridge\RingPHP\Service\RingPHPHandlerFactory */
$handler = $ringPHPHandlerFactory->create(new CurlHandler());
```*Use the collector_middleware service to create your RingPHP middleware and wrap it around your base handler:*
```php
/** @var $dataCollectorMiddleware \Pinkeen\ApiDebugBundle\Bridge\RingPHP\Middleware\DataCollectorMiddleware */
$ringPhpHandler = $dataCollectorMiddleware->createHandler(new GuzzleHttp\Ring\Client\CurlHandler(), 'apiname');
```PS Nicely integrates with elasticsearch-php 2.0.
## Production
For production environment you probably want to skip all of the data gathering.
You should take care of that yourself, unless you're using `Pinkeen\ApiDebugBundle\Bridge\Guzzle\Service\GuzzleClientFactory` or
`Pinkeen\ApiDebugBundle\Bridge\RingPHP\Service\RingPHPHandlerFactory` which skip it when not in debug mode.## Notes
I haven't found an easy way to get call duration out of guzzle6, so there's a regression here. If anybody has an idea
please give me a shout.