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