-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patherror.php
184 lines (165 loc) · 4.36 KB
/
error.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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
<?php
/**
* Gestionnaire des erreurs
*
* @package Library
* @subpackage Error
* @author Siwaÿll <[email protected]>
* @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
* @filesource
*/
namespace Slrfw;
/**
* Gestionnaire des erreurs
*
* @package Library
* @subpackage Error
* @author Siwaÿll <[email protected]>
* @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
* @filesource
*/
final class Error
{
/**
* Code HTTP de l'erreur
*
* @var int
*/
static protected $_code;
/**
* Liste des entêtes http utilisés
* @todo Déporter les descriptions des erreurs http possible dans un tutorial
* @var array
*/
static private $_headers = array(
301 => '301 Moved Permanently',
/** Une authentification est nécessaire pour accéder à la ressource */
401 => '401 Unauthorized',
/** L’authentification est refusée. Contrairement à l’erreur 401, aucune
* demande d’authentification ne sera faite
*/
403 => '403 Forbidden',
404 => '404 Not Found',
405 => '405 Method Not Allowed',
418 => '418 I’m a teapot',
500 => '500 Internal Server Error',
503 => '503 Service Unavailable', // Service temporairement indisponible ou en maintenance
);
/**
* Fonctionnement par défaut, fait passer la page en erreur 500
*
* @return void
* @uses Error::http()
*/
public static function run()
{
self::http(500);
}
/**
* Affiche une erreur HTTP
*
* @param int|array $code Code HTTP de l'erreur
*
* @return void
* @uses Error::setHeader()
*/
public static function http($code)
{
$url = null;
if (is_array($code)) {
$url = $code[1];
$code = $code[0];
}
self::$_code = $code;
self::setHeader($url);
$fileName = self::getPath($code);
if ($fileName !== false) {
include $fileName;
} else {
include 'slrfw/error/500.phtml';
}
}
/**
* Renvois le chemin vers la vue relative à l'erreur
*
* @param string $code code de l'erreur
*
* @return mixed Chemin vers le fichier ou false
*/
private static function getPath($code)
{
$dirs = FrontController::getAppDirs();
foreach ($dirs as $dir) {
$path = $dir['dir'] . DS . 'error' . DS;
$path = new Path($path . $code . '.phtml', Path::SILENT);
if ($path->get()) {
return $path->get();
}
}
return false;
}
/**
* Affiche le message d'erreur demandé pour l'utilisateur
*
* @param Exception\User $exc Exception utilisateur
*
* @return void
* @uses Message
*/
public static function message(Exception\User $exc)
{
$message = new Message($exc->getMessage());
$message->setEtat('error');
list($link, $auto) = $exc->get();
$message->addRedirect($link, $auto);
if ($exc->getTargetInputName() !== '') {
$message->inputName = $exc->getTargetInputName();
}
try {
$message->display();
} catch (\Exception $exc) {
self::http(500);
}
}
/**
* Envois un rapport Marvin et affiche une erreur 500
*
* @param Exception\Marvin $exc Exception à marquer d'un rapport
*
* @return void
* @uses Marvin
* @uses Exception\Marvin::getTitle()
*/
public static function report(Exception\Marvin $exc)
{
$marvin = new Marvin($exc->getTitle(), $exc);
$marvin->send();
self::run();
}
/**
* Affiche le header correspondant à l'erreur
*
* @param string $url Ajoute une redirection au header
*
* @return void
* @uses Error::$_headers
*/
private static function setHeader($url = null)
{
header('HTTP/1.0 ' . self::$_headers[self::$_code]);
if ($url !== null) {
self::setHeaderRedirect($url);
}
}
/**
* Ajoute une redirection dans le header
*
* @param string $url Url vers laquelle on redirige l'utilisateur
*
* @return void
*/
private static function setHeaderRedirect($url)
{
header('Location: ' . $url);
}
}