diff --git a/src/libs/Middleware.php b/src/libs/Middleware.php new file mode 100644 index 0000000..ff1ff2a --- /dev/null +++ b/src/libs/Middleware.php @@ -0,0 +1,66 @@ +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 ?? []); + }; + }; + } +} diff --git a/src/testMiddleware.php b/src/testMiddleware.php new file mode 100644 index 0000000..3faa21f --- /dev/null +++ b/src/testMiddleware.php @@ -0,0 +1,84 @@ + $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);