PHPackages                             shetabit/extractor - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. shetabit/extractor

ActiveLibrary[API Development](/categories/api)

shetabit/extractor
==================

a `micro client` generator to communicate between `micro services` in laravel apps

v4.0.0(3y ago)961995MITPHPPHP &gt;=7.2CI failing

Since Aug 3Pushed 3y ago3 watchersCompare

[ Source](https://github.com/shetabit/extractor)[ Packagist](https://packagist.org/packages/shetabit/extractor)[ Docs](https://github.com/shetabit/extractor)[ RSS](/packages/shetabit-extractor/feed)WikiDiscussions master Synced 3d ago

READMEChangelog (10)Dependencies (6)Versions (14)Used By (0)

 [![](resources/images/microservices-communication.png?raw=true)](resources/images/microservices-communication.png?raw=true)

Laravel Extractor
=================

[](#laravel-extractor)

Communicate with **remote servers** or **microservices** in an easy way.

All requests and responses can be **cached** and **manipulated** on runtime using **middlewares**.

[Donate me](https://yekpay.me/mahdikhanzadi) if you like this package 😎 ![:bowtie:](https://github.githubassets.com/images/icons/emoji/bowtie.png ":bowtie:")

List of contents
----------------

[](#list-of-contents)

- [Install](#install)
- [How to use](#how-to-use)
    - [Send requests](#send-requests)
    - [Send concurrent requests](#send-concurrent-requests)
    - [Event listeners](#event-listeners)
    - [Middlewares](#middlewares)
        - [How to create](#how-to-create)
        - [Global middlewares](#global-middlewares)
    - [Cache](#cache)
    - [Conditional configs](#conditional-configs)
    - [Clients](#Clients)
        - [Create clients](#create-clients)
        - [Run a client](#run-a-client)
        - [Send requests](#send-requests)
        - [Send concurrent requests](#send-concurrent-requests)
- [Change log](#change-log)
- [Contributing](#contributing)
- [Security](#security)
- [Credits](#credits)
- [License](#license)

Install
-------

[](#install)

Via Composer

```
$ composer require shetabit/extractor
```

If you are using `Laravel 5.5` or higher then you don't need to add the provider and alias.

In your `config/app.php` file add below lines.

```
# In your providers array.
'providers' => [
	...
	Shetabit\Extractor\Providers\ExtractorServiceProvider::class,
]
```

How to use
----------

[](#how-to-use)

#### Send requests

[](#send-requests)

you can send requests to remote API using `Request` class, see the below example:

```
// at the top
use Shetabit\Extractor\Classes\Request;

//...

// create new request
$request = new Request();

// set api's url and method
$request->setUri($url)->setMethod('get');

// run the request and get data
$response = $request->fetch();

var_dump($response); // show given response
```

as you see, you can work with remote API in an easy way.

the `Request` has more methods to add `fields`, `headers` and etc.

```
use Shetabit\Extractor\Classes\Request;

//...
$request = new Request();

# Example 1:
$request
	->setUri('http://your-site.com')
	->setMethod('post')
	// add some headers
	->addHeader('Authorization', "Bearer dfaerfaeaeva1351adsfaecva")
	->addHeader('Accept', 'application/json')
	// add form parameters
	->addFormParam('email', $email)
    ->addFormParam('password', $password);

$response = $request->fetch(); // run request

# Example 2:
$request
	->setUri('http://your-site.com')
	->setMethod('get')
	// add query string
	->addQuery('page', $page)
	->addQuery('s', $search);

$response = $request->fetch(); // run request
```

#### Send concurrent requests

[](#send-concurrent-requests)

you can send concurrent requests like the below

```
use Shetabit\Extractor\Classes\Request;
use Shetabit\Extractor\Contracts\RequestInterface;

// ...

$request = new Request;

$responses = $request
    ->createBag()
    ->addRequest(function(RequestInterface $request) {
        $request->setUri('http://google.com/');
    })
    ->addRequest(function(RequestInterface $request) {
        $request->setUri('http://bing.com/');
    })
    ->fetch();
```

#### Event listeners

[](#event-listeners)

you can set `success` and `error` listener for each requests seperately. here is another example that uses `onSuccess` and `onError` listeners.

```
use Shetabit\Extractor\Classes\Request;
use Shetabit\Extractor\Contracts\RequestInterface;

// ...

$request = new Request;

# Example 1: using on success
$response = $request
	->setUri('http://google.com/')
	->onSuccess(function (ResponseInterface $response, RequestInterface $request) {
		echo $response->getBody();
	})
	->fetch();

# Example 2: using on error
$response = $request
	->setUri('http://yahoo.com/')
    ->onSuccess(function (ResponseInterface $response, RequestInterface $request) {
                echo 'success';
            })
            ->onError(function (ResponseInterface $response, RequestInterface $request) {
                echo 'fail';
            });

# Example 3: using request's bag
$response = $request
    ->createBag()
    ->addRequest(function (RequestInterface $request) {
        $request
            ->setUri('http://google.com/')
            ->onSuccess(function (ResponseInterface $response, RequestInterface $request) {
                echo $response->getBody();
            });
    })
    ->addRequest(function (RequestInterface $request) {
        $request
            ->setUri('http://yahoo.com/')
            ->onSuccess(function (ResponseInterface $response, RequestInterface $request) {
                echo 'success';
            })
            ->onError(function (ResponseInterface $response, RequestInterface $request) {
                echo 'fail';
            });
    })
    ->fetch();
```

#### Middlewares

[](#middlewares)

 [![](resources/images/middlewares-chain.png?raw=true)](resources/images/middlewares-chain.png?raw=true)

##### How to create

[](#how-to-create)

Middlewares can be created by running the below command

```
php artisan make:extractor-middleware test
```

The former command will create a middleware named `test` in `app\Http\RemoteRequests\Middlewares` path.

You can add a middleware to request like the below:

```
$request
    ->setUri('http://your-site.com')
    ->setMethod('get')
    ->middleware(new AuthMiddleware)
    ->fetch();
```

Multiple middlewares can be used by calling `middleware` method multiple times:

```
$request
    ->setUri('http://your-site.com')
    ->setMethod('get')
    ->middleware(new Test1)
    ->middleware(new Test2)
    ->fetch();
```

Each middleware has a `handle` method that can be used to handle requests and responses.

The following middleware would perform some task before the request is handled by the application:

```
public function handle($request, Closure $next) {
    if($user->name == 'john') {
        $request->addQuery('name', 'john');
    }

    return $next($request);
}
```

However, this middleware would perform its task after the request is handled by the application:

```
public function handle($request, Closure $next)
{
    $response = $next($request);

    // Perform action

    return $response;
}
```

##### Global middlewares

[](#global-middlewares)

You can use `Request::withGlobalMiddlewares` to add global middlewares. global middlewares will be binded to all requests.

```
// in your AppServiceProvider

protected boot()
{
    Request::withGlobalMiddlewares([
        // list of middlewares
    ]);
}
```

in each request, you can unbind global middlewares, if you need them just use `withoutMiddleware` like the below:

```
// at the top
use Shetabit\Extractor\Classes\Request;

$url = 'http://google.com/';

$response = (new Request)
	->setUri($url)
	->withoutMiddleware(new TestMiddleware)
	->fetch();
```

##### Cache

[](#cache)

you can cache responses according to requests.

```
// at the top
use Shetabit\Extractor\Classes\Request;

$url = 'http://google.com/';
$ttl = 5; // 5 seconds

$response = (new Request)->setUri($url)->cache($ttl)->fetch();
```

**Notice:** `TTL` (Time To Live) is the same as `Laravel` cache.

```
// at the top
use Shetabit\Extractor\Classes\Request;

$url = 'http://google.com/';
$ttl = now()->addMinutes(10); // 10 minutes

$response = (new Request)->setUri($url)->cache($ttl)->fetch();
```

#### Conditional configs

[](#conditional-configs)

Sometimes you need to add some configs when a condition happens, in this kind of situations you can use the `when` method to add conditional configs.

```
# Example 1: simple

$request
    ->when('condition1', function($request) {
        $request
            ->setUri('http://your-site.com')
            ->setMethod('get')
            ->middleware(new AuthMiddleware);
    });

// Example 2: nested
$request
    ->when('condition1', function($request) {
        $request
            ->setUri('http://your-site.com')
            ->setMethod('get')
            ->middleware(new AuthMiddleware);
    })
    ->when('condition2', function($request) {
        $request
            ->setUri('http://shop-site.com')
            ->setMethod('get');
    })
    ->whenNot('condition3', function($request) {
        $request
            ->setUri('http://shop-site.com')
            ->setMethod('patch')
            ->when('condition4', function($request) {
                $request->setMethod('delete'); // sets method to delete
            });
    })
    ->fetch();
```

#### Client

[](#client)

You can encapsulate any request that exists between the **current microservice** and the **remote microservice** within a `Client`.

#### Create clients

[](#create-clients)

Clients can be created using a simple command

```
php artisan make:extractor-client  clientName
```

Clients will saved in `app/Http/RemoteRequests/Clients` by default.

lets create and example, imagine you have and remote Api (or microservice) and need to login into it.

then, your Login micro-client can be similar to below codes:

```
namespace App\Http\RemoteRequests\Clients\Auth;

use Shetabit\Extractor\Abstracts\MicroClientAbstract;
use Shetabit\Extractor\Contracts\ResponseInterface;

class Login extends MicroClientAbstract
{
    protected $mobile;
    protected $password;

    public function __construct($username, $password = null)
    {
        $this->username = $username;
        $this->password = $password;

        parent::__construct();
    }

    /**
     * Get requests' endpoint
     *
     * @return string
     */
    protected function getEndPoint()
    {
        return 'http://yoursite.com/api/v1/auth';
    }

    /**
     * Run client
     *
     * @return ResponseInterface
     * @throws \Exception
     */
    public function run() : ResponseInterface
    {
        $response = $this
            ->request
            ->setUri($this->getEndPoint())
            ->setMethod('post')
            ->addFormParam('username', $this->username)
            ->addFormParam('password', $this->password)
            ->fetch();

         return $response;
    }
}
```

#### Run a client

[](#run-a-client)

you can run the `Login` micro-client like the below (we have Login client example at the top)

```
// dump data
$username = 'test';
$password = 'something';

$client = new Login($username, $password);

// run client and login into remote service (remote api)
$response = $client->run();

// dump show response's body
var_dump($response->getBody());
```

as you see, client starts to work as you call the `run` method, fetches and returns a response.

On progress features
--------------------

[](#on-progress-features)

- internal error exceptions
- resource and API resource clients
- proxy requests to another server (middleware)

Change log
----------

[](#change-log)

Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.

Contributing
------------

[](#contributing)

Please see [CONTRIBUTING](CONTRIBUTING.md) and [CONDUCT](CONDUCT.md) for details.

Security
--------

[](#security)

If you discover any security related issues, please email  instead of using the issue tracker.

Credits
-------

[](#credits)

- [Mahdi khanzadi](https://github.com/khanzadimahdi)
- [All Contributors](../../contributors)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

###  Health Score

33

—

LowBetter than 75% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity25

Limited adoption so far

Community17

Small or concentrated contributor base

Maturity61

Established project with proven stability

 Bus Factor2

2 contributors hold 50%+ of commits

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~108 days

Recently: every ~276 days

Total

13

Last Release

1173d ago

Major Versions

v1.1.2 → v2.02019-11-25

v2.0.1 → v3.02020-02-18

v3.4.1 → v4.0.02023-02-27

### Community

Maintainers

![](https://www.gravatar.com/avatar/dbffd65b893ed400216ab503ee3901f943fe225804e9d5aa3502dab0837ae201?d=identicon)[khanzadimahdi](/maintainers/khanzadimahdi)

![](https://www.gravatar.com/avatar/9d73b855df70ba50a46d879126a3f32fb173d12ca3e778e0a72b7398cbef8a26?d=identicon)[shetabit](/maintainers/shetabit)

---

Top Contributors

[![khanzadimahdi](https://avatars.githubusercontent.com/u/6291970?v=4)](https://github.com/khanzadimahdi "khanzadimahdi (29 commits)")[![roshedgostarandev1](https://avatars.githubusercontent.com/u/52368299?v=4)](https://github.com/roshedgostarandev1 "roshedgostarandev1 (28 commits)")[![amirsadeghi1](https://avatars.githubusercontent.com/u/26359326?v=4)](https://github.com/amirsadeghi1 "amirsadeghi1 (1 commits)")[![Globerada](https://avatars.githubusercontent.com/u/26659866?v=4)](https://github.com/Globerada "Globerada (1 commits)")

---

Tags

laravel-microservicesmicroservicemicroservice-communicationapi clientmicro serviceextractorshetabitapi extractorapi remote clientmicro service clientmicro service data extractorremote micro service

###  Code Quality

TestsPHPUnit

Code StylePHP\_CodeSniffer

### Embed Badge

![Health badge](/badges/shetabit-extractor/health.svg)

```
[![Health](https://phpackages.com/badges/shetabit-extractor/health.svg)](https://phpackages.com/packages/shetabit-extractor)
```

###  Alternatives

[skagarwal/google-places-api

Google Places Api

1913.0M8](/packages/skagarwal-google-places-api)[dcblogdev/laravel-microsoft-graph

A Laravel Microsoft Graph API (Office365) package

168285.5k1](/packages/dcblogdev-laravel-microsoft-graph)[crowdin/crowdin-api-client

PHP client library for Crowdin API v2

611.5M5](/packages/crowdin-crowdin-api-client)[boci/hetzner-laravel

A Laravel SDK for interacting with the Hetzner Cloud API - inspired by Nuno Maduro's OpenAI PHP client

901.4k](/packages/boci-hetzner-laravel)[jasara/php-amzn-selling-partner-api

A fluent interface for Amazon's Selling Partner API in PHP

1344.8k1](/packages/jasara-php-amzn-selling-partner-api)[grantholle/powerschool-api

A Laravel package to make interacting with PowerSchool less painful.

1715.6k1](/packages/grantholle-powerschool-api)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
