-
Notifications
You must be signed in to change notification settings - Fork 0
/
Application.php
108 lines (84 loc) · 2.7 KB
/
Application.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
namespace BaseXMS;
use Zend\ServiceManager\ServiceManager;
use Zend\EventManager\EventManager;
use Zend\Mvc\Application as ZendApplication;
use Zend\Mvc\MvcEvent;
use Zend\Stdlib\RequestInterface as Request;
use Zend\Stdlib\ResponseInterface as Response;
class Application extends ZendApplication
{
protected $baseXMSEventManager;
public function __construct( $configuration, ServiceManager $serviceManager )
{
parent::__construct( $configuration, $serviceManager );
$this->baseXMSEventManager = new EventManager();
// shortcut the control lookup
$this->getEventManager()->attach( MvcEvent::EVENT_DISPATCH, array( $this, 'onDispatch' ) );
//TODO: moving to a dedicated function
$this->serviceManager->setFactory( 'log', 'BaseXMS\Log\Factory' );
$this->serviceManager->setService( 'user', new \BaseXMS\User() );
}
public function onDispatch( $e )
{
$request = $e->getRequest();
$routeMatch = $e->getRouteMatch();
$response = $this->getResponse();
$return = $this->dispatch( $request, $response, $routeMatch );
$e->setResult( $return );
$e->stopPropagation( true );
return $return;
}
public function getBaseXMSEventManager()
{
return $this->baseXMSEventManager;
}
public function dispatch( Request $request, Response $response = null, $routeMatch )
{
$siteAccess = SiteaccessFactory::factory(
$this->getServiceManager(),
$routeMatch->getParam( 'context' )
);
return $siteAccess->getResponse( $this->getServiceManager(), $routeMatch->getParam( 'path' ) );
}
public function run()
{
$events = $this->getEventManager();
$event = $this->getMvcEvent();
// Define callback used to determine whether or not to short-circuit
$shortCircuit = function ($r) use ($event) {
if ($r instanceof ResponseInterface) {
return true;
}
if ($event->getError()) {
return true;
}
return false;
};
// Trigger route event
$result = $events->trigger(MvcEvent::EVENT_ROUTE, $event, $shortCircuit);
if ($result->stopped()) {
$response = $result->last();
if ($response instanceof ResponseInterface) {
$event->setTarget($this);
$event->setResponse($response);
$events->trigger(MvcEvent::EVENT_FINISH, $event);
return $response;
}
if ($event->getError()) {
return $this->completeRequest($event);
}
return $event->getResponse();
}
if ($event->getError()) {
return $this->completeRequest($event);
}
// Trigger dispatch event
$result = $events->trigger(MvcEvent::EVENT_DISPATCH, $event, $shortCircuit);
// Complete response
$response = $result->last();
//TODO: replace this shortcut hack
return $response;
}
}
?>