Skip to content

Commit 74f8d31

Browse files
committed
add global middlewares
1 parent 1dad3cd commit 74f8d31

File tree

3 files changed

+136
-62
lines changed

3 files changed

+136
-62
lines changed

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,22 @@ public function handle($request, Closure $next)
140140
}
141141
```
142142

143+
you can use Request::withGlobalMiddlewares to add global middlewares.
144+
global middlewares will be binded to all requests.
145+
146+
```php
147+
148+
// in your AppServiceProvider
149+
150+
protected boot()
151+
{
152+
Request::withGlobalMiddlewares([
153+
// list of middlewares
154+
]);
155+
}
156+
157+
```
158+
143159
##### Cache
144160

145161
you can cache responses according to requests.

src/Classes/Request.php

Lines changed: 2 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,13 @@
77
use Shetabit\Extractor\Traits\Conditional;
88
use Shetabit\Extractor\Traits\HasParsedUri;
99
use GuzzleHttp\Client;
10-
use Shetabit\Extractor\Contracts\MiddlewareInterface;
11-
use Shetabit\Extractor\Middlewares\CacheMiddleware;
12-
use Shetabit\Extractor\Middlewares\Middleware;
10+
use Shetabit\Extractor\Traits\HasMiddleware;
1311

1412
class Request implements RequestInterface
1513
{
1614
use HasParsedUri;
1715
use Conditional;
16+
use HasMiddleware;
1817

1918
/**
2019
* Request's EndPoint
@@ -108,13 +107,6 @@ class Request implements RequestInterface
108107
*/
109108
protected $onErrorCallback = null;
110109

111-
/**
112-
* Middlewares
113-
*
114-
* @var array
115-
*/
116-
protected $middlewares = [];
117-
118110
/**
119111
* Request constructor.
120112
*
@@ -631,56 +623,4 @@ public function createBag()
631623
{
632624
return new Bag();
633625
}
634-
635-
/**
636-
* Bind cache middleware
637-
*
638-
* @param $ttl
639-
*
640-
* @return $this
641-
*/
642-
public function cache($ttl = 10)
643-
{
644-
$this->middleware(new CacheMiddleware($ttl));
645-
646-
return $this;
647-
}
648-
649-
/**
650-
* Add middlewares
651-
*
652-
* @param MiddlewareInterface $middleware
653-
*
654-
* @return $this
655-
*/
656-
public function middleware(MiddlewareInterface $middleware)
657-
{
658-
array_push($this->middlewares, $middleware);
659-
660-
return $this;
661-
}
662-
663-
/**
664-
* Retrieve a chain of middlewares
665-
*
666-
* @return MiddlewareInterface
667-
*/
668-
protected function createMiddlewaresChain() : ?MiddlewareInterface
669-
{
670-
$chain = new Middleware;
671-
$middlewares = $this->middlewares;
672-
673-
$latest = null;
674-
foreach ($middlewares as $middleware) {
675-
if (is_null($latest)) {
676-
$chain->linkWith($middleware);
677-
} else {
678-
$latest->linkWith($middleware);
679-
}
680-
681-
$latest = $middleware;
682-
}
683-
684-
return $chain;
685-
}
686626
}

src/Traits/HasMiddleware.php

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
<?php
2+
3+
namespace Shetabit\Extractor\Traits;
4+
5+
use Shetabit\Extractor\Contracts\MiddlewareInterface;
6+
use Shetabit\Extractor\Middlewares\CacheMiddleware;
7+
use Shetabit\Extractor\Middlewares\Middleware;
8+
9+
trait HasMiddleware
10+
{
11+
/**
12+
* Global middlewares
13+
* this middlewares that will be binded into all requests
14+
*
15+
* @var array
16+
*/
17+
public static $globalMiddlewares = [];
18+
19+
/**
20+
* A list of middlewares that's not expected to run
21+
*
22+
* @var array
23+
*/
24+
public $bannedMiddlewares = [];
25+
26+
/**
27+
* Middlewares
28+
*
29+
* @var array
30+
*/
31+
protected $middlewares = [];
32+
33+
/**
34+
* Add global middlewares
35+
*
36+
* @param array $middlewares
37+
*
38+
* @return void
39+
*/
40+
public static function withGlobalMiddlewares(array $middlewares)
41+
{
42+
foreach($middlewares as $middleware) {
43+
$middlewareInstance = ($middleware instanceof MiddlewareInterface) ? $middleware : new $middleware;
44+
45+
array_push(static::$globalMiddlewares, $middlewareInstance);
46+
}
47+
}
48+
49+
/**
50+
* Add a middleware that's not expected to run
51+
*
52+
* @param MiddlewareInterface $middleware
53+
*
54+
* @return $this
55+
*/
56+
public function withoutMiddleware(MiddlewareInterface $middleware)
57+
{
58+
array_push($this->bannedMiddlewares, $middleware);
59+
60+
return $this;
61+
}
62+
63+
/**
64+
* Bind cache middleware
65+
*
66+
* @param $ttl
67+
*
68+
* @return $this
69+
*/
70+
public function cache($ttl = 10)
71+
{
72+
$this->middleware(new CacheMiddleware($ttl));
73+
74+
return $this;
75+
}
76+
77+
/**
78+
* Add middlewares
79+
*
80+
* @param MiddlewareInterface $middleware
81+
*
82+
* @return $this
83+
*/
84+
public function middleware(MiddlewareInterface $middleware)
85+
{
86+
array_push($this->middlewares, $middleware);
87+
88+
return $this;
89+
}
90+
91+
/**
92+
* Retrieve a chain of middlewares
93+
*
94+
* @return MiddlewareInterface
95+
*/
96+
protected function createMiddlewaresChain() : ?MiddlewareInterface
97+
{
98+
$chain = new Middleware;
99+
100+
$middlewares = array_diff(
101+
array_merge(static::$globalMiddlewares, $this->middlewares),
102+
$this->bannedMiddlewares
103+
);
104+
105+
$latest = null;
106+
foreach ($middlewares as $middleware) {
107+
if (is_null($latest)) {
108+
$chain->linkWith($middleware);
109+
} else {
110+
$latest->linkWith($middleware);
111+
}
112+
113+
$latest = $middleware;
114+
}
115+
116+
return $chain;
117+
}
118+
}

0 commit comments

Comments
 (0)