static methods
Ik ben op dit moment bezig met mijn eigen (mini) framework. Nu kwam ik laatst eens tegen dat static methods 'bad practise' zijn en dat je deze niet moet gebruiken.
In de onderstaande class gebruik ik static methods voor het redirecten/refreshen van een pagina.
Code (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
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
<?php
namespace System\Framework\HTTP;
use System\Framework\Routing\Route;
use System\Framework\Application;
class Response {
public static function redirect($routeName, $status_code = 302) {
$routeInfo = route::getRouteByName($routeName);
if(!$routeInfo) {
throw new \Exception(sprintf('Route %s not found!', $routeName));
} else {
if(!headers_sent()) {
header('location: ' . self::getBasePath() . $routeInfo[1], false, $status_code);
}
}
exit();
}
public static function URLRedirect($url, $status_code = 302) {
if(!headers_sent()) {
header('location: ' . $url, true, $status_code);
} else {
throw new \ErrorException('Headers already send, could not redirect.');
}
exit();
}
public static function refresh() {
if(!headers_sent()) {
header('location: ' . self::getBasePath() . self::getUri());
} else {
throw new \ErrorException('Headers already send, could not refresh page.');
}
exit();
}
public static function getUri() {
if (isset($_GET['r'])) {
$uri = $_GET['r'];
} else {
$uri = '/';
}
return $uri;
}
public static function getBasePath() {
$config = Application::getConfig();
return $config['BasePath'];
}
}
?>
namespace System\Framework\HTTP;
use System\Framework\Routing\Route;
use System\Framework\Application;
class Response {
public static function redirect($routeName, $status_code = 302) {
$routeInfo = route::getRouteByName($routeName);
if(!$routeInfo) {
throw new \Exception(sprintf('Route %s not found!', $routeName));
} else {
if(!headers_sent()) {
header('location: ' . self::getBasePath() . $routeInfo[1], false, $status_code);
}
}
exit();
}
public static function URLRedirect($url, $status_code = 302) {
if(!headers_sent()) {
header('location: ' . $url, true, $status_code);
} else {
throw new \ErrorException('Headers already send, could not redirect.');
}
exit();
}
public static function refresh() {
if(!headers_sent()) {
header('location: ' . self::getBasePath() . self::getUri());
} else {
throw new \ErrorException('Headers already send, could not refresh page.');
}
exit();
}
public static function getUri() {
if (isset($_GET['r'])) {
$uri = $_GET['r'];
} else {
$uri = '/';
}
return $uri;
}
public static function getBasePath() {
$config = Application::getConfig();
return $config['BasePath'];
}
}
?>
Is dit een goede manier om dit te doen of is dit ook 'bad practise'?
Gewijzigd op 01/10/2013 21:16:14 door Jordi Kroon
De functie getBasePath bijvoorbeeld. Die zal iets moeten worden als:
Code (php)
De klasse mag helemaal niet bepalen dat de setting uit een Application klasse komt. Dat wordt bepaalt buiten de klasse.
De config is bij mij een array. Hoe kan ik deze dan het beste aanroepen? Is een config class om de config array uit te lezen een slimme zet?
Ja, dat lijkt mij het mooist. Maar je kan hem ook in de applicatie klasse houden, het geen het mij om ging is dat de klasse dat niet zelf mag bepalen. Je mag natuurlijk nog steeds Response->setBasePath($app->getConfig('basepath')) gebruiken.
Code (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
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
<?php
namespace System\Framework\HTTP;
use System\Framework\Routing\Route;
use System\Framework\Config;
class Response {
public function redirect($routeName, $status_code = 302) {
$route = new Route;
$routeInfo = $route -> getByName($routeName);
if (!$routeInfo) {
throw new \Exception(sprintf('Route %s not found!', $routeName));
} else {
if (!headers_sent()) {
header('location: ' . $this -> getBasePath() . $routeInfo[1], false, $status_code);
} else {
throw new \ErrorException('Headers already send, could not redirect.');
}
}
exit();
}
public function URLRedirect($url, $status_code = 302) {
if (!headers_sent()) {
header('location: ' . $url, true, $status_code);
} else {
throw new \ErrorException('Headers already send, could not redirect.');
}
exit();
}
public function refresh() {
if (!headers_sent()) {
header('location: ' . $this -> getBasePath() . $this -> getUri());
} else {
throw new \ErrorException('Headers already send, could not refresh page.');
}
exit();
}
public function getUri() {
if (isset($_GET['r'])) {
$uri = $_GET['r'];
} else {
$uri = '/';
}
return $uri;
}
public function getBasePath() {
$config = new config;
return $config -> get('BasePath');
}
}
?>
namespace System\Framework\HTTP;
use System\Framework\Routing\Route;
use System\Framework\Config;
class Response {
public function redirect($routeName, $status_code = 302) {
$route = new Route;
$routeInfo = $route -> getByName($routeName);
if (!$routeInfo) {
throw new \Exception(sprintf('Route %s not found!', $routeName));
} else {
if (!headers_sent()) {
header('location: ' . $this -> getBasePath() . $routeInfo[1], false, $status_code);
} else {
throw new \ErrorException('Headers already send, could not redirect.');
}
}
exit();
}
public function URLRedirect($url, $status_code = 302) {
if (!headers_sent()) {
header('location: ' . $url, true, $status_code);
} else {
throw new \ErrorException('Headers already send, could not redirect.');
}
exit();
}
public function refresh() {
if (!headers_sent()) {
header('location: ' . $this -> getBasePath() . $this -> getUri());
} else {
throw new \ErrorException('Headers already send, could not refresh page.');
}
exit();
}
public function getUri() {
if (isset($_GET['r'])) {
$uri = $_GET['r'];
} else {
$uri = '/';
}
return $uri;
}
public function getBasePath() {
$config = new config;
return $config -> get('BasePath');
}
}
?>
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$response = new Response();
$response->setBasePath($config->get('basepath'));
// of
// $response->setBasePath('/whoa');
?>
$response = new Response();
$response->setBasePath($config->get('basepath'));
// of
// $response->setBasePath('/whoa');
?>
Toevoeging op 01/10/2013 22:50:25:
Ook het route gedoe heb je nog niet begrepen. Laat ik een voorbeeldje gebruiken:
Ik kom als bezoeker aan in een gevangenis waar iedereen altijd in hun cel zit en ik mag vrij door de gangen lopen. Ik ben opzoek naar een gevangene. Ga ik nu bij elke cel aan de gavangene vragen voor die bepaalde persoon? Nee, want die gevangene weten niks van elkaar. Sterker nog, die gevangenen mogen niks van elkaar weten. Ik ga naar de hoofdbewaker en vraag het aan hem.
Zo werkt het ook met route objecten. Ik kan niet zomaar aan een route object vragen naar een ander route object, daar mag hij niks vanaf weten. Ik moet aan een klasse die gaat over het opslaan en verkrijgen van die route objecten vragen naar het object. Dat object noemen we een datamapper
Gewijzigd op 01/10/2013 22:50:56 door Wouter J
Nu maak ik in mijn controller een nieuw response object aan. Alleen is het niet verstandig om iedere keer setBasePath aan te roepen na het aanmaken van het object. Hoe kan ik dit het beste doen?
Code (php)
1
2
2
$response = new \System\Framework\Http\Response;
$response->redirectTo($this->config['basePath'] .'/hierjepath');
$response->redirectTo($this->config['basePath'] .'/hierjepath');
Op die manier kun je ook je Response class gebruiken om te redirecten naar pagina's die niet bij je eigen site horen.
Gewijzigd op 03/10/2013 10:02:24 door NOLot -
Dat lijkt mij geen goed plan. Bij een refresh wil ik namelijk geen parameters versturen. Ook is het zo dat redirect alleen redirect naar routes. URLRedirect redirect naar interne/externe links.