HttpKernel::filterResponse()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 2
1
<?php
2
3
/*
4
 * This file is part of the jade/jade package.
5
 *
6
 * (c) Slince <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Jade\HttpKernel;
13
14
use Psr\Http\Message\ResponseInterface;
15
use Psr\Http\Message\ServerRequestInterface;
16
use Psr\Http\Server\RequestHandlerInterface;
17
use Jade\HttpKernel\Event\FilterControllerEvent;
18
use Jade\HttpKernel\Event\FilterResponseEvent;
19
use Jade\HttpKernel\Event\GetResponseEvent;
20
use Jade\HttpKernel\Event\PostResponseEvent;
21
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
22
use Zend\HttpHandlerRunner\Emitter\EmitterInterface;
23
use Zend\Stratigility\MiddlewarePipeInterface;
24
25
final class HttpKernel implements RequestHandlerInterface
26
{
27
    /**
28
     * @var EventDispatcherInterface
29
     */
30
    protected $eventDispatcher;
31
32
    /**
33
     * @var MiddlewarePipeInterface
34
     */
35
    protected $pipeline;
36
37
    /**
38
     * @var ControllerResolverInterface
39
     */
40
    protected $controllerResolver;
41
42
    /**
43
     * @var ArgumentResolverInterface
44
     */
45
    protected $argumentResolver;
46
47
    /**
48
     * @var EmitterInterface
49
     */
50
    protected $emitter;
51
52
    public function __construct(
53
        EventDispatcherInterface $eventDispatcher,
54
        ControllerResolverInterface $controllerResolver,
55
        ArgumentResolverInterface $argumentResolver,
56
        MiddlewarePipeInterface $pipeline,
57
        EmitterInterface $emitter
58
    ){
59
        $this->eventDispatcher = $eventDispatcher;
60
        $this->controllerResolver = $controllerResolver;
61
        $this->argumentResolver = $argumentResolver;
62
        $this->pipeline = $pipeline;
63
        $this->emitter = $emitter;
64
    }
65
66
    /**
67
     * {@inheritdoc}
68
     */
69
    public function handle(ServerRequestInterface $request): ResponseInterface
70
    {
71
        // 1. 触发事件
72
        $event = new GetResponseEvent($this, $request);
73
        $this->eventDispatcher->dispatch($event, KernelEvents::REQUEST);
74
        // 2. 调度middleware
75
        return $this->pipeline->process($event->getRequest(), new CallableRequestHandler([$this, 'handleRequest']));
76
    }
77
78
    /**
79
     * Emit response.
80
     *
81
     * @param ServerRequestInterface $request
82
     * @param ResponseInterface $response
83
     */
84
    public function terminate(ServerRequestInterface $request, ResponseInterface $response)
85
    {
86
        $event = new PostResponseEvent($this, $request, $response);
87
        $this->eventDispatcher->dispatch($event, KernelEvents::TERMINATE);
88
89
        $this->emitter->emit($response);
90
    }
91
92
    /**
93
     * 处理请求
94
     *
95
     * @param ServerRequestInterface $request
96
     * @return ResponseInterface
97
     */
98
    public function handleRequest(ServerRequestInterface $request): ?ResponseInterface
99
    {
100
        // 1. middleware 到达结束
101
        $event = new GetResponseEvent($this, $request);
102
        $this->eventDispatcher->dispatch($event, KernelEvents::MIDDLEWARE);
103
        $request = $event->getRequest();
104
105
        if ($event->hasResponse()) {
106
            return $this->filterResponse($event->getResponse(), $request);
107
        }
108
109
        // 2. 获取控制器
110
        $controller = $this->controllerResolver->getController($request);
111
        $event = new FilterControllerEvent($this, $request, $controller);
112
        $this->eventDispatcher->dispatch($event, KernelEvents::CONTROLLER);
113
114
        $controller = $event->getController();
115
        $response = call_user_func_array($controller,
116
            $this->argumentResolver->getArguments($request, $controller)
117
        );
118
119
        // 3. 过滤响应体
120
        return $this->filterResponse($response, $request);
121
    }
122
123
    protected function filterResponse(ResponseInterface $response, ServerRequestInterface $request)
124
    {
125
        $event = new FilterResponseEvent($this, $request, $response);
126
        $this->eventDispatcher->dispatch($event, KernelEvents::RESPONSE);
127
        return $event->getResponse();
128
    }
129
}