5
5
6
6
use Closure ;
7
7
use Throwable ;
8
+ use LogicException ;
8
9
use Psr \Container \ContainerInterface ;
9
- use Psr \ Http \ Message \ ResponseInterface ;
10
+ use TheWebSolver \ Codegarage \ Lib \ Pipe ;
10
11
use Psr \Http \Server \MiddlewareInterface ;
11
12
use TheWebSolver \Codegarage \Lib \Resolver ;
12
- use Psr \Http \Message \ServerRequestInterface ;
13
- use Psr \Http \Server \RequestHandlerInterface ;
13
+ use Psr \Http \Message \ResponseInterface as Response ;
14
+ use Psr \Http \Message \ServerRequestInterface as Request ;
15
+ use Psr \Http \Server \RequestHandlerInterface as Handler ;
16
+ use TheWebSolver \Codegarage \Lib \Interfaces \PipeInterface ;
14
17
use TheWebSolver \Codegarage \Lib \Error \InvalidMiddlewareForPipe ;
15
18
16
19
class Middleware implements MiddlewareInterface {
@@ -19,11 +22,11 @@ class Middleware implements MiddlewareInterface {
19
22
20
23
private const RESOLVER_TYPES = array ( MiddlewareInterface::class, InvalidMiddlewareForPipe::class );
21
24
22
- /** @param Closure(ServerRequestInterface, RequestHandlerInterface ): ResponseInterface $middleware */
25
+ /** @param Closure(Request, Handler ): Response $middleware */
23
26
// phpcs:ignore Squiz.Commenting.FunctionComment.IncorrectTypeHint
24
27
public function __construct ( private readonly Closure $ middleware ) {}
25
28
26
- public function process ( ServerRequestInterface $ request , RequestHandlerInterface $ handler ): ResponseInterface {
29
+ public function process ( Request $ request , Handler $ handler ): Response {
27
30
return ( $ this ->middleware )( $ request , $ handler );
28
31
}
29
32
@@ -38,4 +41,24 @@ public static function create(
38
41
throw new InvalidMiddlewareForPipe ( $ e ->getMessage (), $ e ->getCode (), $ e );
39
42
}
40
43
}
44
+
45
+ public static function toPipe (
46
+ string |Closure |MiddlewareInterface $ handler ,
47
+ ?ContainerInterface $ container = null
48
+ ): PipeInterface {
49
+ return Pipe::create (
50
+ static fn ( Response $ subject , Closure $ next , Request $ request , mixed ...$ args ) => $ next (
51
+ self ::create ( $ handler , $ container )
52
+ ->process ( $ request , self ::withHandler ( $ subject , reset ( $ args ) ) )
53
+ )
54
+ );
55
+ }
56
+
57
+ private static function withHandler ( Response $ response , mixed $ arg ): Handler {
58
+ $ handler = is_string ( $ arg ) ? new $ arg ( $ response ) : new RequestHandler ( $ response );
59
+
60
+ return $ handler instanceof Handler
61
+ ? $ handler
62
+ : throw new LogicException ( 'Invalid Request Handler provided for pipeline: ' . $ arg );
63
+ }
41
64
}
0 commit comments