-
Notifications
You must be signed in to change notification settings - Fork 6
/
FrontController.php
executable file
·86 lines (78 loc) · 2.63 KB
/
FrontController.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
<?php
namespace Controller;
class FrontController
{
const DEFAULT_ACTION = "index";
const DEFAULT_CONTROLLER = "Index";
const BASE_PATH = '';
protected $controller = self::DEFAULT_CONTROLLER;
protected $action = self::DEFAULT_ACTION;
protected $params = array();
public function __construct(array $options = array()) {
if (empty($options)) {
$this->parseUri();
}
else {
if (isset($options["controller"])) {
$this->setController($options["controller"]);
}
if (isset($options["action"])) {
$this->setAction($options["action"]);
}
if (isset($options["params"])) {
$this->setParams($options["params"]);
}
}
}
protected function parseUri() {
$path = trim(parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH), "/");
if($path === self::BASE_PATH){
$this->setController($this->controller);
$this->setAction($this->action);
}else{
if(self::BASE_PATH != ''){
$path = trim(str_replace(self::BASE_PATH, "", $path), "/");
}
@list($controller, $action, $params) = explode("/", $path, 3);
if (isset($controller)){
$this->setController($controller);
}
if (isset($action)){
$this->setAction($action);
}
if (isset($params)){
$this->setParams(explode("/", $params));
}
}
}
public function setController($controller) {
$controller = ucfirst(strtolower($controller)) . "Controller";
$controller = "Controller\\" . $controller;
if (!class_exists($controller)) {
header("HTTP/1.0 404 Not Found");
echo "<h1>404 Not Found</h1>";
echo "Página não encontrada. Ir para <a href='/produtos'>Home</a>";
exit();
}
$this->controller = $controller;
return $this;
}
public function setAction($action) {
$reflector = new \ReflectionClass($this->controller);
if (!$reflector->hasMethod($action)) {
header("HTTP/1.0 404 Not Found");
echo "<h1>404 Not Found</h1>";
echo "Página não encontrada. Ir para <a href='/produtos'>Home</a>";
exit();
}
$this->action = $action;
return $this;
}
public function setParams(array $params) {
$this->params = $params;
return $this;
}
public function run() {
call_user_func_array(array(new $this->controller, $this->action), $this->params);
}
}