[OOP] Routing: hoe?
Weet er iemand hoe je correct kunt routen dmv OOP in PHP?
Ik heb al een klein opzetje met de werking ervan gemaakt, wat denken jullie ervan?
dit topic of is dat niet wat je wilt doen?
En misschien kan je ook eens naar het MVC patern zien. Dat doet de routering ook hoe jij het wilt denk ik.
Misschien kan je iets doen met de reacties van wouter uit En misschien kan je ook eens naar het MVC patern zien. Dat doet de routering ook hoe jij het wilt denk ik.
Daarnaast klopt het wel half, behalve dat ik vind dat een Router moet matchen en een Kernel/FrontController moet dispatchen.
Kijk inderdaad eens naar deze reactie. Hierin som ik 3 opties op:
- Het geweldige KISS voorbeeld van Pim;
- Silex;
- Symfony2 Componenten.
Daarnaast heb ik ook ooit zoiets opgebouwd: code en voorbeelden
Ik keek even naar je code voorbeelden en ik zag een Collection class?
Nu dacht ik aan het volgende
1) Abstract class maken 'Collection'
2) Class maken 'RouteCollection' die 'Collection' extends
3) Route's toevoegen aan de RouteCollection
4) Een frontcontroller maken die uiteindelijk dan in een RouteCollection kijkt en de juiste route inlaad.
Zoiets?
Gewijzigd op 26/11/2012 16:47:52 door - Raoul -
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$collection = new RouteCollection();
$collection
->addRoute('frontpage', new Route('/', 'StoreController::showFirst10'))
->addRoute('show_product', new Route('/product/:slug', 'StoreController::show'))
->addRoute('buy_product', new Route('/product/:slug/buy', 'StoreController::buy'))
;
$adminbundle = new RouteCollection();
$adminbundle
->addRoute('create_product', new Route('/product/create', 'ProductBackendBundle::create'))
->addRoute('create_user', new Route('/user/create', 'UserBackendBundle::create'))
;
$collection->addCollection($adminbundle);
?>
$collection = new RouteCollection();
$collection
->addRoute('frontpage', new Route('/', 'StoreController::showFirst10'))
->addRoute('show_product', new Route('/product/:slug', 'StoreController::show'))
->addRoute('buy_product', new Route('/product/:slug/buy', 'StoreController::buy'))
;
$adminbundle = new RouteCollection();
$adminbundle
->addRoute('create_product', new Route('/product/create', 'ProductBackendBundle::create'))
->addRoute('create_user', new Route('/user/create', 'UserBackendBundle::create'))
;
$collection->addCollection($adminbundle);
?>
Je kan zelfs addRoute an addCollection vervangen door een simpele add method, deze kijkt of je een Route of een RouteCollection toevoegt en roept dan de juiste collection aan.
Deze stop je in een Router en dan roep je Router::match(Request $request) aan. Dan krijg je een mooie recursieve loop totdat je route is gevonden:
Hij gaat elke route of routecollection af en roept de match aan. De Route::match() method is uit eindelijk de method die kijkt of de route matched. Als het weer een routecollection is gaat die weer elke method af en roept weer de match method aan en zo kun je eindeloos veel collections in elkaar stoppen.
En ja, wat ik hierboven vertel komt inderdaad overeen met wat jij hierboven schets (behalve dat ik eerder een Interface zou maken dan een abstracte klasse).
Zo'n Request class lijkt me wel mooi.
Ik kan dan toch ook andere functie's invoegen in zo'n Request als bijvoorbeeld:
- getRequestMethod()
- getUri()
Bedankt voor de link, ik ga aan de slag.
{
if(strlen($_GET['page']) == 0)
{
$_GET['page'] = 'frontpage';
}
$Controller = ucfirst(strtolower($_GET['page'])); // onze controller naam
if(!file_exists('Application/Controller/'.$Controller.'.php'))
{
// als controller niet bestaat add error controller
$Controller = ucfirst(strtolower('error'));
}
include_once('Application/Controller/'.$Controller.'.php'); // laad de controller in
$Class = new $Controller();
$Class->Render(); // laat de data uit de controllers
}
dit is een voorbeeld van hoe ik het altijd doe je hebt bijvoorbeeld index.php?page=homepage
en hier nog even de .htacces
RewriteEngine on
RewriteRule ^(|/)$ index.php
RewriteRule ^([a-zA-Z0-9/_-]+)(|)$ index.php?page=$1
ErrorDocument 400 index.php?page=error
ErrorDocument 401 index.php?page=error
ErrorDocument 403 index.php?page=error
ErrorDocument 404 index.php?page=error
ErrorDocument 500 index.php?page=error
ErrorDocument 501 index.php?page=error
ErrorDocument 502 index.php?page=error
ErrorDocument 503 index.php?page=error
ErrorDocument 504 index.php?page=error
ErrorDocument 505 index.php?page=error