parent
922e13d022
commit
c761fd6d24
@ -0,0 +1,66 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace libs; |
||||||
|
|
||||||
|
interface Middleware |
||||||
|
{ |
||||||
|
public function handle($request, \Closure $next, ...$parameters); |
||||||
|
} |
||||||
|
|
||||||
|
class Pipeline |
||||||
|
{ |
||||||
|
protected array $middleware = []; |
||||||
|
protected $request; |
||||||
|
|
||||||
|
public function send($request): Object |
||||||
|
{ |
||||||
|
$this->request = $request; |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
public function through(array $middleware): Object |
||||||
|
{ |
||||||
|
$this->middleware = $middleware; |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
public function then(\Closure $destination) |
||||||
|
{ |
||||||
|
$pipeline = array_reduce( |
||||||
|
array_reverse($this->parseMiddleware($this->middleware)), |
||||||
|
$this->carry(), |
||||||
|
function ($request) use ($destination) { |
||||||
|
return $destination($request); |
||||||
|
} |
||||||
|
); |
||||||
|
|
||||||
|
return $pipeline($this->request); |
||||||
|
} |
||||||
|
|
||||||
|
protected function parseMiddleware(array $middleware) |
||||||
|
{ |
||||||
|
return array_map(function ($m) { |
||||||
|
return is_string($m) ? explode(':', $m, 2) : $m; |
||||||
|
}, $middleware); |
||||||
|
} |
||||||
|
|
||||||
|
protected function carry() |
||||||
|
{ |
||||||
|
return function ($stack, $middleware) { |
||||||
|
return function ($request) use ($stack, $middleware) { |
||||||
|
if (is_array($middleware)) { |
||||||
|
[$middleware, $parameters] = [ |
||||||
|
$middleware[0], |
||||||
|
isset($middleware[1]) ? explode(',', $middleware[1]) : [] |
||||||
|
]; |
||||||
|
} |
||||||
|
|
||||||
|
if (is_string($middleware)) { |
||||||
|
$middleware = new $middleware; |
||||||
|
} |
||||||
|
|
||||||
|
return $middleware->handle($request, $stack, ...$parameters ?? []); |
||||||
|
}; |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,84 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
require "libs/autoload.php"; |
||||||
|
|
||||||
|
class TrimStrings implements libs\Middleware |
||||||
|
{ |
||||||
|
public function handle($request, \Closure $next, ...$parameters) |
||||||
|
{ |
||||||
|
foreach ($request as $key => $value) { |
||||||
|
if (is_string($value)) { |
||||||
|
$request[$key] = trim($value); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return $next($request); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class ucStrings implements libs\Middleware |
||||||
|
{ |
||||||
|
public function handle($request, \Closure $next, ...$parameters) |
||||||
|
{ |
||||||
|
foreach ($request as $key => $value) { |
||||||
|
if (is_string($value)) { |
||||||
|
$request[$key] = ucwords($value); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return $next($request); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class ConvertEmptyStringsToNull implements libs\Middleware |
||||||
|
{ |
||||||
|
public function handle($request, \Closure $next, ...$parameters) |
||||||
|
{ |
||||||
|
foreach ($request as $key => $value) { |
||||||
|
if ($value === '') { |
||||||
|
$request[$key] = null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return $next($request); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class RoleCheck implements libs\Middleware |
||||||
|
{ |
||||||
|
public function handle($request, Closure $next, ...$parameters) |
||||||
|
{ |
||||||
|
$role = $parameters[0] ?? ''; |
||||||
|
$level = $parameters[1] ?? 'high'; |
||||||
|
if (!isset($request['user_role']) || $request['user_role'] !== $role) { |
||||||
|
throw new Exception("Requires {$role} privileges (level: {$level})"); |
||||||
|
} |
||||||
|
|
||||||
|
return $next($request); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Create a request |
||||||
|
$request = [ |
||||||
|
'user_role' => 'admin', |
||||||
|
'name' => ' john doe ', |
||||||
|
'email' => ' john@Example.com ', |
||||||
|
'age' => '44', |
||||||
|
'active' => true, |
||||||
|
]; |
||||||
|
|
||||||
|
// Process through middleware |
||||||
|
$response = (new libs\Pipeline) |
||||||
|
->send($request) |
||||||
|
->through([ |
||||||
|
'RoleCheck:admin,high', |
||||||
|
TrimStrings::class, |
||||||
|
ucStrings::class, |
||||||
|
ConvertEmptyStringsToNull::class, |
||||||
|
]) |
||||||
|
->then(function ($request) { |
||||||
|
// Final handler |
||||||
|
return $request; |
||||||
|
}); |
||||||
|
|
||||||
|
print_r($response); |
||||||
Loading…
Reference in new issue