gang banged middlewares

This commit is contained in:
2025-11-03 15:01:26 +03:00
parent 234691f011
commit b61599aac9

View File

@@ -10,7 +10,9 @@ use mirzaev\minimal\http\request,
mirzaev\minimal\route; mirzaev\minimal\route;
// Built-in libraries // Built-in libraries
use Closure as closure; use Closure as closure,
LogicException as exception_logic
;
/** /**
* Middleware * Middleware
@@ -26,14 +28,14 @@ use Closure as closure;
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy> * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/ */
final class middleware class middleware
{ {
/** /**
* Function * Function
* *
* @var closure $function Function * @var closure|array $function Function
*/ */
public readonly closure $function; public readonly closure|array $function;
/** /**
* Constructor * Constructor
@@ -42,10 +44,28 @@ final class middleware
* *
* @return void * @return void
*/ */
public function __construct(closure $function) public function __construct(?closure $function = null)
{ {
// Writing the function if (static::class === self::class) {
$this->function = $function; // The middleware class itself
// Writing the function
$this->function = $function;
} else {
// The middleware inheriting class
if (method_exists($this, 'middleware')) {
// Found the method
// Writing the function
$this->function = [$this, 'middleware'];
} else {
// Not found the method
// Exit (fail)
throw new exception_logic('The middleware method is not initialized', 500);
}
}
} }
/** /**
@@ -56,9 +76,9 @@ final class middleware
* *
* @return string Output * @return string Output
*/ */
public function __invoke(callable $next, controller $controller): string public function __invoke(callable $next, controller $controller): string
{ {
// Processing the middleware (entering into recursion) // Processing the middleware (entering into recursion)
return (string) ($this->function)(next: $next, controller: $controller); return (string) ($this->function)(next: $next, controller: $controller);
} }
} }