Completed
Push — master ( 3ddb26...ab8c9b )
by Andreas
19:31
created

subscriber::on_response()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 4.944

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 4
c 1
b 0
f 0
nc 3
nop 1
dl 0
loc 9
ccs 2
cts 5
cp 0.4
crap 4.944
rs 10
1
<?php
2
/**
3
 * @package midcom.routing
4
 * @author CONTENT CONTROL http://www.contentcontrol-berlin.de/
5
 * @copyright CONTENT CONTROL http://www.contentcontrol-berlin.de/
6
 * @license http://www.gnu.org/licenses/gpl.html GNU General Public License
7
 */
8
9
namespace midcom\httpkernel;
10
11
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
12
use midcom_response_styled;
13
use midcom_baseclasses_components_handler;
14
use Symfony\Component\HttpKernel\KernelEvents;
15
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
16
use Symfony\Component\HttpKernel\Event\FilterControllerArgumentsEvent;
17
use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
18
use midcom\routing\resolver;
19
use Symfony\Component\HttpFoundation\Request;
20
use midcom;
21
use midcom_connection;
22
use midcom_core_context;
23
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
24
use Symfony\Component\HttpFoundation\StreamedResponse;
25
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
26
27
/**
28
 * @package midcom.httpkernel
29
 */
30
class subscriber implements EventSubscriberInterface
31
{
32
    private $initialized = false;
33
34
    public static function getSubscribedEvents()
35
    {
36
        return [
37
            KernelEvents::REQUEST => ['on_request'],
38
            KernelEvents::CONTROLLER_ARGUMENTS => ['on_arguments'],
39
            KernelEvents::VIEW => ['on_view'],
40
            KernelEvents::RESPONSE => ['on_response'],
41
            KernelEvents::EXCEPTION => ['on_exception']
42
        ];
43
    }
44
45 1
    private function initialize(Request $request)
46
    {
47 1
        $midcom = midcom::get();
48 1
        $midcom->debug->log("Start of MidCOM run " . $request->server->get('REQUEST_URI', ''));
49 1
        $request->setSession($midcom->session);
50 1
        $midcom->componentloader->load_all_manifests();
51 1
        if ($response = $midcom->auth->check_for_login_session($request)) {
52
            return $response;
53
        }
54
55
        // This checks for the unittest case
56 1
        if (!$request->attributes->has('context')) {
57
            // Initialize Context Storage
58
            $context = midcom_core_context::enter(midcom_connection::get_url('uri'));
59
            $request->attributes->set('context', $context);
60
        }
61
        // Initialize the UI message stack from session
62 1
        $midcom->uimessages->initialize($request);
63
64 1
        $midcom->dispatcher->addListener(KernelEvents::REQUEST, [$midcom->cache->content, 'on_request'], 10);
65 1
        $midcom->dispatcher->addListener(KernelEvents::RESPONSE, [$midcom->cache->content, 'on_response'], -10);
66 1
    }
67
68
    /**
69
     * @param GetResponseEvent $event
70
     */
71 338
    public function on_request(GetResponseEvent $event)
72
    {
73 338
        $request = $event->getRequest();
74 338
        if (!$this->initialized) {
75 1
            $this->initialized = true;
76 1
            if ($response = $this->initialize($request)) {
77
                $event->setResponse($response);
78
                return;
79
            }
80
        }
81
82 338
        $resolver = new resolver($request);
83
84 338
        if ($resolver->process_midcom()) {
85
            return;
86
        }
87
88 338
        $resolver->process_component();
89 338
        $request->attributes->set('data', '__request_data__');
90 338
    }
91
92 338
    public function on_arguments(FilterControllerArgumentsEvent $event)
93
    {
94 338
        $arguments = $event->getArguments();
95 338
        foreach ($arguments as $i => $argument) {
96 325
            if ($argument === '__request_data__') {
97 232
                $context = $event->getRequest()->attributes->get('context');
98 232
                $arguments[$i] =& $context->get_custom_key('request_data');
99
            }
100
        }
101 338
        $event->setArguments($arguments);
102 338
    }
103
104 75
    public function on_view(GetResponseForControllerResultEvent $event)
105
    {
106 75
        $attributes = $event->getRequest()->attributes;
107 75
        $controller = $attributes->get('_controller');
108 75
        if ($controller[0] instanceof midcom_baseclasses_components_handler) {
109 75
            $controller[0]->populate_breadcrumb_line();
110
        }
111 75
        $event->setResponse(new midcom_response_styled($attributes->get('context')));
112 75
    }
113
114 338
    public function on_response(FilterResponseEvent $event)
115
    {
116 338
        if ($event->isMasterRequest()) {
117
            $response = $event->getResponse();
118
            if ($response instanceof StreamedResponse) {
119
                // if we have a streamed response, we need to send right away
120
                // otherwise exceptions in the callback won't be caught by the kernel
121
                // which means e.g. that a midcom-exec script couldn't show a login screen
122
                $response->send();
123
            }
124
        }
125 338
    }
126
127
    public function on_exception(GetResponseForExceptionEvent $event)
128
    {
129
        $handler = new \midcom_exception_handler();
130
        $event->setResponse($handler->render($event->getException()));
131
    }
132
}