main
Robert 8 months ago
parent 922e13d022
commit c761fd6d24
  1. 66
      src/libs/Middleware.php
  2. 84
      src/testMiddleware.php

@ -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…
Cancel
Save