-
Notifications
You must be signed in to change notification settings - Fork 0
/
Application.php
120 lines (91 loc) · 2.69 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
109
110
111
112
113
114
115
116
117
118
119
120
<?php
namespace aj\phpmvc;
use aj\phpmvc\db\Database;
class Application
{
const EVENT_BEFORE_REQUEST = "beforeRequest";
const EVENT_AFTER_REQUEST = "afterRequest";
protected array $eventListeners = [];
public static Application $app;
public static string $ROOT_DIR;
public string $layout="main";
public View $view;
public string $userClass;
public Router $router;
public Database $db;
public ?UserModel $user;
public Request $request;
public Response $response;
public Session $session;
public ?Controller $controller=null;
public function __construct($rootPath,array $config)
{
self::$app = $this;
$this->userClass= $config['userClass'];
self::$ROOT_DIR = $rootPath;
$this->request = new Request();
$this->response = new Response();
$this->session = new Session();
$this->router = new Router($this->request,$this->response);
$this->view = new View();
$this->db = new Database($config['db']);
$primaryValue = $this->session->get('user');
if($primaryValue)
{
$primaryKey = $this->userClass::primaryKey();
$this->user = $this->userClass::findOne([$primaryKey => $primaryValue]);
}else{
$this->user = null;
}
}
public function getController()
{
$this->controller;
}
public function setController(Controller $controller)
{
$this->controller= $controller;
}
public function run()
{
try {
//Trigger EventListener
$this->triggerEvent(self::EVENT_BEFORE_REQUEST);
echo $this->router->resolve();
} catch (\Exception $e) {
$this->response->setStatusCode($e->getCode());
echo $this->view->renderView('_error',[
'exception'=>$e
]);
}
}
public function on($eventName,$callback)
{
$this->eventListeners[$eventName][] = $callback;
}
public function triggerEvent($eventName)
{
//
$callbacks = $this->eventListeners[$eventName] ?? [];
foreach ($callbacks as $callback) {
call_user_func($callback);
}
}
public function login(UserModel $user)
{
$this->user = $user;
$primaryKey = $user->primaryKey();
$primaryValue = $user->{$primaryKey};
$this->session->set('user',$primaryValue);
return true;
}
public function logout()
{
$this->user = null;
$this->session->remove('user');
}
public static function isGuest()
{
return !self::$app->user;
}
}