Single Point Entry met url
Als ik een leden overzicht wil dan krijg ik www.site.nl/leden (en geeft hij leden.php weer). Nu wil ik een lid en zou dan het volgende willen intikken: www.site.nl/leden/pieter-dekker. Alleen weet ik niet zo goed hoe ik dit kan doen met de code.
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
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
<?php
// Read REQUEST_URI, suppress errors (gave E_WARNING prior to PHP 5.3.3).
$uriData = @parse_url($_SERVER['REQUEST_URI']);
$path = '';
if ($uriData === false) {
// Do something?
} else {
if (isset($uriData['path'])) {
// We might be in a subdirectory of the webroot.
// We are only interested in the part starting from this relative root.
$path = str_replace(DIRECTORY_SEPARATOR, '/', $uriData['path']);
$relativePath = str_replace(DIRECTORY_SEPARATOR, '/', dirname($_SERVER['SCRIPT_NAME']));
// Strip the relative path from $path.
$path = substr($path, strlen($relativePath));
// Finally, strip any leading/trailing slashes so we end up with a "cleaned" path.
$path = trim($path, '/');
}
}
$pathParts = explode('/', $path);
if (empty($pathParts[0])) {
include('homepage.php');
} else {
// controleer hier eerste deel van applicatiepad
switch ($pathParts[0]) {
case 'leden':
// do stuff;
include 'leden.php';
break;
// et cetera
case 'over':
include 'over.php';
break;
case 'nieuws':
include 'nieuws.php';
break;
default: // niet-bestaande pagina, toon 404
}
}
?>
// Read REQUEST_URI, suppress errors (gave E_WARNING prior to PHP 5.3.3).
$uriData = @parse_url($_SERVER['REQUEST_URI']);
$path = '';
if ($uriData === false) {
// Do something?
} else {
if (isset($uriData['path'])) {
// We might be in a subdirectory of the webroot.
// We are only interested in the part starting from this relative root.
$path = str_replace(DIRECTORY_SEPARATOR, '/', $uriData['path']);
$relativePath = str_replace(DIRECTORY_SEPARATOR, '/', dirname($_SERVER['SCRIPT_NAME']));
// Strip the relative path from $path.
$path = substr($path, strlen($relativePath));
// Finally, strip any leading/trailing slashes so we end up with a "cleaned" path.
$path = trim($path, '/');
}
}
$pathParts = explode('/', $path);
if (empty($pathParts[0])) {
include('homepage.php');
} else {
// controleer hier eerste deel van applicatiepad
switch ($pathParts[0]) {
case 'leden':
// do stuff;
include 'leden.php';
break;
// et cetera
case 'over':
include 'over.php';
break;
case 'nieuws':
include 'nieuws.php';
break;
default: // niet-bestaande pagina, toon 404
}
}
?>
Gewijzigd op 22/04/2020 14:54:51 door Kees Mulder
Doe anders eens
print_r($pathParts)
Dan zie je al je argumenten in je URL.
Een mogelijke strategie is dat je de URL "opeet" totdat je een class/PHP-bestand vindt met een overeenkomstige naam (en pad).
Dit lijkt mij de simpelste manier.
Anders zul je letterlijke URLs moeten gaan matchen met een lijst zoals je hierboven doet of via de database.
Maar dat leent zich weer niet echt voor URLs die deels vast (/leden/pietje-puk) en deels variabel/dynamisch (/leden/pietje-puk) zijn.
Wat ik wel vrees is dat je niet zomaar wat code kunt knippen en plakken en dat je dan in een keer een complete applicatie hebt die werkt. Je zult hier een systeem omheen moeten bouwen (of in ieder geval een minimale hoeveelheid werk verzetten zoals de eerste bovengenoemde strategie) om dit aan de praat te krijgen.
Dit vergt echt wat extra (denk)werk en structurering van code.
Gewijzigd op 22/04/2020 19:24:52 door Thomas van den Heuvel