Mijn CMS'je werkt met mod_rewrite. Als er een pagina wordt aangeroepen, lees ik eerst de URL uit, en verwerk deze:
Neem nu als voorbeeld:
Ik heb deze functie geschreven met het idee dat als er iets verandert in de url opbouw, ik alleen deze functie hoef aan te passen. Er zitten echter wat nadelen aan deze fucntie:
• elke keer als ik ergens in mijn applicatie een call maak, wordt de hele url opnieuw ontleed. Dat kost tijd
• ik heb niet alle functionaliteit die ik zou willen, zoals de grootte van 'pad' bepalen (sizeof van de pad array). Nu zou ik de functie kunnen uitbreiden maar dan heb ik het idee dat het zo'n gedrocht wordt.
Ik heb uiteindelijk voor een functievorm gekozen omdat ik niet een hele zooi variabelen aan wil maken, zoals
Want dan moet ik in elk toekomstig stukje code een heleboel globals aanhalen in die nog te schrijven functies. Echter, zojuist heb ik gekeken hoe bijvoorbeeld Geeklog een en ander doet. Zij stoppen bijvoorbeeld alle variabelen (van database naam tot IP banlist tot templates) in een $_CONF array. Nu was dus mijn idee om deze functie (ik heb nog geen idee hoe) een dergelijke array te laten uitspugen:
Het voordeel is:
• dat ik op elke request maar 1 keer de url hoef te ontleden en de array vul. Verdere code maakt dan gebruik van de $_CONF global ipv dat zij een functie call maken;
• ik heb nu wel de beschikking over sizeof(...) en in_array(...) mogelijkheden
Deze code is de basis van mijn systeem, en moet daarom zo handig mogelijk ontworpen worden. Ik twijfel nogal, vooral omdat mijn ervaring met grootschalige projecten beperkt is. Niet dat dit CMS nou zo enterprise-class is ofzo, maar het is wel het project waar ik nog jaren vol plezier aan bezig wil zijn. Ik wil niet elke 3 maanden de basis opnieuw hoeven te maken. Aan jullie dus de vraag: welke oplossing zouden jullie kiezen en waarom?
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
| function q($part=NULL, $index=NULL) { if (isset($_GET['q'])) { $q = explode('$', $_GET['q']); if (isset($q[1])) $arg = $q[1]; $qs = explode('/', $q[0]); $ids = Array(); $pad = Array(); if (is_numeric($qs[0])) { for ($i = 1; $i < count($qs); $i++) $ids[] = $qs[$i]; $pad[] = $url[0]; } else { for ($i = 0; $i < count($qs); $i++) { if (is_numeric($qs[$i])) $ids[] = $qs[$i]; else $pad[] = $qs[$i]; } } if (isset($part)) { switch ($part) { case 'pad': if (isset($index)) return $pad[$index]; else return rtrim(implode('/', $pad), '/'); break; case 'id': if (isset($index)) return $ids[$index]; else return implode('/', $ids); break; case 'arg': return $arg; break; } } else { if (isset($_GET['q'])) return $_GET['q']; else return false; } } else { return false; } } |
Neem nu als voorbeeld:
code:
1
2
3
4
5
6
7
| $_GET['q'] = http://www.site.com/bedrijf/management/2004/06$print en dan enkele voorbeelden van functie calls: - q('pad') levert op: bedrijf/management - q('pad', 1) levert op: management - q('id', 0) levert op: 2004 |
Ik heb deze functie geschreven met het idee dat als er iets verandert in de url opbouw, ik alleen deze functie hoef aan te passen. Er zitten echter wat nadelen aan deze fucntie:
• elke keer als ik ergens in mijn applicatie een call maak, wordt de hele url opnieuw ontleed. Dat kost tijd
• ik heb niet alle functionaliteit die ik zou willen, zoals de grootte van 'pad' bepalen (sizeof van de pad array). Nu zou ik de functie kunnen uitbreiden maar dan heb ik het idee dat het zo'n gedrocht wordt.
Ik heb uiteindelijk voor een functievorm gekozen omdat ik niet een hele zooi variabelen aan wil maken, zoals
PHP:
1
2
3
4
5
| $pad[0] = 'bedrijf'; $pad[1] = 'management'; $id[0] = 2004; ..etc.. |
Want dan moet ik in elk toekomstig stukje code een heleboel globals aanhalen in die nog te schrijven functies. Echter, zojuist heb ik gekeken hoe bijvoorbeeld Geeklog een en ander doet. Zij stoppen bijvoorbeeld alle variabelen (van database naam tot IP banlist tot templates) in een $_CONF array. Nu was dus mijn idee om deze functie (ik heb nog geen idee hoe) een dergelijke array te laten uitspugen:
PHP:
1
2
3
4
5
6
| $_CONF['url']['pad'] = 'bedrijf/management'; $_CONF['url']['pad'][0] = 'bedrijf'; $_CONF['url']['pad'][1] = 'management'; $_CONF['url']['id'] = '2004/06'; $_CONF['url']['id'][0] = 2004; ...etc.. |
Het voordeel is:
• dat ik op elke request maar 1 keer de url hoef te ontleden en de array vul. Verdere code maakt dan gebruik van de $_CONF global ipv dat zij een functie call maken;
• ik heb nu wel de beschikking over sizeof(...) en in_array(...) mogelijkheden
Deze code is de basis van mijn systeem, en moet daarom zo handig mogelijk ontworpen worden. Ik twijfel nogal, vooral omdat mijn ervaring met grootschalige projecten beperkt is. Niet dat dit CMS nou zo enterprise-class is ofzo, maar het is wel het project waar ik nog jaren vol plezier aan bezig wil zijn. Ik wil niet elke 3 maanden de basis opnieuw hoeven te maken. Aan jullie dus de vraag: welke oplossing zouden jullie kiezen en waarom?
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."