Skip to content

Commit

Permalink
add global middlewares
Browse files Browse the repository at this point in the history
  • Loading branch information
khanzadimahdi committed Feb 18, 2020
1 parent 1dad3cd commit 74f8d31
Show file tree
Hide file tree
Showing 3 changed files with 136 additions and 62 deletions.
16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,22 @@ public function handle($request, Closure $next)
}
```

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

```php

// in your AppServiceProvider

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

```

##### Cache

you can cache responses according to requests.
Expand Down
64 changes: 2 additions & 62 deletions src/Classes/Request.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,13 @@
use Shetabit\Extractor\Traits\Conditional;
use Shetabit\Extractor\Traits\HasParsedUri;
use GuzzleHttp\Client;
use Shetabit\Extractor\Contracts\MiddlewareInterface;
use Shetabit\Extractor\Middlewares\CacheMiddleware;
use Shetabit\Extractor\Middlewares\Middleware;
use Shetabit\Extractor\Traits\HasMiddleware;

class Request implements RequestInterface
{
use HasParsedUri;
use Conditional;
use HasMiddleware;

/**
* Request's EndPoint
Expand Down Expand Up @@ -108,13 +107,6 @@ class Request implements RequestInterface
*/
protected $onErrorCallback = null;

/**
* Middlewares
*
* @var array
*/
protected $middlewares = [];

/**
* Request constructor.
*
Expand Down Expand Up @@ -631,56 +623,4 @@ public function createBag()
{
return new Bag();
}

/**
* Bind cache middleware
*
* @param $ttl
*
* @return $this
*/
public function cache($ttl = 10)
{
$this->middleware(new CacheMiddleware($ttl));

return $this;
}

/**
* Add middlewares
*
* @param MiddlewareInterface $middleware
*
* @return $this
*/
public function middleware(MiddlewareInterface $middleware)
{
array_push($this->middlewares, $middleware);

return $this;
}

/**
* Retrieve a chain of middlewares
*
* @return MiddlewareInterface
*/
protected function createMiddlewaresChain() : ?MiddlewareInterface
{
$chain = new Middleware;
$middlewares = $this->middlewares;

$latest = null;
foreach ($middlewares as $middleware) {
if (is_null($latest)) {
$chain->linkWith($middleware);
} else {
$latest->linkWith($middleware);
}

$latest = $middleware;
}

return $chain;
}
}
118 changes: 118 additions & 0 deletions src/Traits/HasMiddleware.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
<?php

namespace Shetabit\Extractor\Traits;

use Shetabit\Extractor\Contracts\MiddlewareInterface;
use Shetabit\Extractor\Middlewares\CacheMiddleware;
use Shetabit\Extractor\Middlewares\Middleware;

trait HasMiddleware
{
/**
* Global middlewares
* this middlewares that will be binded into all requests
*
* @var array
*/
public static $globalMiddlewares = [];

/**
* A list of middlewares that's not expected to run
*
* @var array
*/
public $bannedMiddlewares = [];

/**
* Middlewares
*
* @var array
*/
protected $middlewares = [];

/**
* Add global middlewares
*
* @param array $middlewares
*
* @return void
*/
public static function withGlobalMiddlewares(array $middlewares)
{
foreach($middlewares as $middleware) {
$middlewareInstance = ($middleware instanceof MiddlewareInterface) ? $middleware : new $middleware;

array_push(static::$globalMiddlewares, $middlewareInstance);
}
}

/**
* Add a middleware that's not expected to run
*
* @param MiddlewareInterface $middleware
*
* @return $this
*/
public function withoutMiddleware(MiddlewareInterface $middleware)
{
array_push($this->bannedMiddlewares, $middleware);

return $this;
}

/**
* Bind cache middleware
*
* @param $ttl
*
* @return $this
*/
public function cache($ttl = 10)
{
$this->middleware(new CacheMiddleware($ttl));

return $this;
}

/**
* Add middlewares
*
* @param MiddlewareInterface $middleware
*
* @return $this
*/
public function middleware(MiddlewareInterface $middleware)
{
array_push($this->middlewares, $middleware);

return $this;
}

/**
* Retrieve a chain of middlewares
*
* @return MiddlewareInterface
*/
protected function createMiddlewaresChain() : ?MiddlewareInterface
{
$chain = new Middleware;

$middlewares = array_diff(
array_merge(static::$globalMiddlewares, $this->middlewares),
$this->bannedMiddlewares
);

$latest = null;
foreach ($middlewares as $middleware) {
if (is_null($latest)) {
$chain->linkWith($middleware);
} else {
$latest->linkWith($middleware);
}

$latest = $middleware;
}

return $chain;
}
}

0 comments on commit 74f8d31

Please sign in to comment.