Passed
Pull Request — master (#22)
by Wanderson
02:51
created

Application::getPage()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 3
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 5
rs 10
1
<?php
2
3
namespace Win;
4
5
use PDO;
6
use Win\Common\DependenceInjector as DI;
7
use Win\Common\Utils\Str;
8
use Win\Controllers\Controller;
9
use Win\HttpException;
10
use Win\Services\Router;
11
use Win\Templates\Template;
12
use Win\Templates\View;
13
14
/**
15
 * Application (WinPHP Framework)
16
 *
17
 * Framework em PHP baseado em MVC
18
 * Responsável por incluir as páginas de acordo com a URL e criar a estrutura MVC
19
 * @author winPHP Framework <http://github.com/winframework/winphp/>
20
 * @version 1.7.0
21
 */
22
class Application
23
{
24
	protected static Application $instance;
25
26
	public Controller $controller;
27
	public Router $router;
28
	public View $view;
29
	public ?PDO $pdo = null;
30
31
	/**
32
	 * Cria a aplicação principal
33
	 */
34
	public function __construct()
35
	{
36
		static::$instance = $this;
37
		$this->router = Router::instance();
38
	}
39
40
	/**
41
	 * Retorna o ponteiro para a aplicação principal
42
	 * @return static
43
	 */
44
	public static function app()
45
	{
46
		return static::$instance;
47
	}
48
49
	/**
50
	 * Executa o Controller@action e envia o retorno como resposta
51
	 * @param string $class Controller
52
	 * @param string $method Action
53
	 * @param array $args
54
	 */
55
	public function run($class, $method = 'index', ...$args)
56
	{
57
		if (!class_exists($class)) {
58
			throw new HttpException("Controller '{$class}' not found", 404);
59
		}
60
		/** @var Controller $controller */
61
		$controller = DI::make($class);
62
		$controller->app = $this;
63
		$this->controller = $controller;
64
		$this->router->action = $method;
65
		$this->router->page = $this->getPage();
66
67
		if (!method_exists($controller, $method)) {
68
			throw new HttpException("Action '{$method}' not found in '{$class}'", 404);
69
		}
70
71
		$controller->init();
72
		$response = $controller->$method(...$args);
73
		echo $this->send($response);
74
	}
75
76
	/**
77
	 * Envia a resposta baseado no tipo
78
	 * @param mixed $response
79
	 * @return mixed
80
	 * @codeCoverageIgnore
81
	 */
82
	private function send($response)
83
	{
84
		if (is_array($response)) {
85
			header('Content-Type: application/json');
86
			return json_encode($response);
87
		}
88
		if ($response instanceof View && $this->controller->layout) {
89
			$response = new Template($this->controller->layout, ['content' => $response]);
90
		}
91
92
		return $response;
93
	}
94
95
	/**
96
	 * Retorna TRUE se está na página inicial
97
	 * @return bool
98
	 */
99
	public function isHomePage()
100
	{
101
		return $this->router->segments == Router::HOME;
102
	}
103
104
	/**
105
	 * Define a página como 404
106
	 * @param string $message
107
	 * @throws HttpException
108
	 */
109
	public function page404($message = '')
110
	{
111
		throw new HttpException($message, 404);
112
	}
113
114
	/**
115
	 * Define a página atual como algum erro
116
	 * @param int $code
117
	 * @param string $message
118
	 * @throws HttpException
119
	 */
120
	public function errorPage($code, $message = '')
121
	{
122
		throw new HttpException($message, $code);
123
	}
124
125
	/**
126
	 * Retorna a página atual
127
	 * @return string
128
	 */
129
	public function getPage()
130
	{
131
		$class = get_class($this->controller);
132
		$replaces = ['Controllers\\', 'Controller', 'App\\', '\\'];
133
		return Str::toUrl(str_replace($replaces, ' ', $class));
134
	}
135
}
136