route class
Reacties?
Tom Swinkels op 13/09/2013 18:20:45:
Reacties?
Op je laatste vraag over een 404?
Dat hangt ervan af wat je met een 404 wilt doen en kunt doen. Domweg een "niet gevonden" melden is de kortste route, maar ook de weg van de minste weerstand.
Persoonlijk denk ik dat je hiermee niet kunt wegkomen bij een slimme website. Fouten melden kan iedereen, maar fouten voor gebruikers oplossen is een kunst.
Wat doe je bijvoorbeeld bij één misplaatst karakter in een URL? Gooi je dan meteen de "404 Not Found"-handdoek in de ring? Of laat je direct de webpagina zien die het meest overeenkomt met de request van de client? Of meldt je de fout en toon je de meest geschikte routes?
Kies maar... het juiste antwoord lijkt me duidelijk.
Waarom? Navigatie loopt via links, en als een of andere idio(o)t(e) in de url wil gaan lopen rommelen is het niet meer normaal dat hij/zij een page not found handoek aangereikt krijgt.
Ger van Steenderen op 13/09/2013 18:52:07:
Waarom? Navigatie loopt via links, en als een of andere idio(o)t(e) in de url wil gaan lopen rommelen is het niet meer normaal dat hij/zij een page not found handoek aangereikt krijgt.
Bijvoorbeeld voor backlinks die worden gemaakt door onhandige kopiëren-en-plakkers of door hun kromme tools in krom geschreven PHP...
Als daar een é of een ë in zit, loopt een router vaak vast. Je zou echter ook kunnen kiezen voor een router die snapt dat een é of een ë eigenlijk een e is.
Dit geeft je hopelijk een idee van wat ik bedoel:
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
66
67
68
69
70
71
72
73
74
75
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
<?php
interface HTTPExceptionResponse {
getResponse();
}
class HTTPException extends Exception implements HTTPExceptionResponse {
function getResponse() {
return (new Response)->status($this->getCode());
}
}
class HTTPException404 extends HTTPException {
function __construct($message, Exception $previous = NULL) {
parent::__construct($message, 404, $previous);
}
function getResponse() {
$view = new View('errors/http/404');
return parent::getResponse()->body($view->render());
}
}
class Response {
private $body;
private $status = 200;
private $headers = array();
function sendHeaders() {
foreach($this->headers as $header => $value) {
header(ucfirst("$header: $value"));
}
}
function body($body = NULL) {
if (func_num_args())
{
$this->body = (string) $body;
return $this;
} else {
return $this->body;
}
}
function status($code = NULL) {
if (func_num_args()) {
$this->status = (int) $code;
return $this;
} else {
return $this->status;
}
}
}
set_exception_handler(function(Exception $e) {
if ($e instanceof HTTPExceptionResponse) {
ob_get_level() AND ob_end_clean();
echo $e->getResponse()->sendHeaders()->body();
exit(1);
}
// log de exception, 500 error
});
[/code]
PS. Dependency Injection > Registry
interface HTTPExceptionResponse {
getResponse();
}
class HTTPException extends Exception implements HTTPExceptionResponse {
function getResponse() {
return (new Response)->status($this->getCode());
}
}
class HTTPException404 extends HTTPException {
function __construct($message, Exception $previous = NULL) {
parent::__construct($message, 404, $previous);
}
function getResponse() {
$view = new View('errors/http/404');
return parent::getResponse()->body($view->render());
}
}
class Response {
private $body;
private $status = 200;
private $headers = array();
function sendHeaders() {
foreach($this->headers as $header => $value) {
header(ucfirst("$header: $value"));
}
}
function body($body = NULL) {
if (func_num_args())
{
$this->body = (string) $body;
return $this;
} else {
return $this->body;
}
}
function status($code = NULL) {
if (func_num_args()) {
$this->status = (int) $code;
return $this;
} else {
return $this->status;
}
}
}
set_exception_handler(function(Exception $e) {
if ($e instanceof HTTPExceptionResponse) {
ob_get_level() AND ob_end_clean();
echo $e->getResponse()->sendHeaders()->body();
exit(1);
}
// log de exception, 500 error
});
[/code]
PS. Dependency Injection > Registry
Gewijzigd op 13/09/2013 20:08:26 door Dos Moonen
Het gaat er niet over uit wat voor error pagina.
Wie is er verantwoordelijk voor, is dat de router of de controller?
Nogmaals, de router gaat over de routes, dus ik zou zeggen dat de router een default route krijgt en als hij een route niet gevonden krijgt stuurt hij alles door naar de default route?
NOLot linkte al een goed artikel over Dependency Injection. Hier zijn nog een aantal punten waar ik het mee eens ben: http://stackoverflow.com/questions/3525238/which-is-better-dependency-injectionregistry-or-dependency-injection-or-global
Wie zegt dat ik een 404 pagina wil zien wanneer de route niet gevonden is?
Misschien wil ik standaard als de pagina niet bestaat altijd de homepagina zien?
Ik zal nog eens wat dingen over Dependency Injection lezen. Start daar anders wel een nieuw topic over, kunnen we hier nog even het router verhaal afronden.
*schop*
404 is de error code voor "File Not Found". Een 404 pagina is dus een pagina die je laat zien wanneer er een bestand/route niet gevonden is. Als jij je home page als 404 pagina wilt gebruiken, prima. Daar ging het me niet om.
Waar ik het niet mee eens ben is het idee van een default route. Ik wil dat je een exception gooit, of dit nou een RouteNotFoundException, HTTP404Excption, FileNotFoundException of een ander genaamde exception is maakt me niet uit.
"De router is toch verantwoordelijk voor alle routes, het lijkt mij dus toch logisch om daarvoor een default route te maken?" De router is verantwoordelijk om zo mogelijk een route voor de opgegeven URI te vinden. Die route wordt daarna gebruikt om de juiste method van een controller class uit te laten voeren.
Als er geen route gevonden is het een 'exceptional situation' naar mijn idee. De router gooit dus een exception die hoger op in je applicatie gebruikt wordt om te bepalen wat er nu gebeurd moet worden. In dit geval de homepage voorschotelen. En er misschien nog een melding aan toe te voegen zodat de gebruiken weet dat de opgegeven URI ongeldig is.
Gewijzigd op 18/09/2013 10:14:46 door Dos Moonen