Simpele PHP router
Ben bezig een simpele PHP router te maken.
Ik ben al een heel stuk op weg maar loop tegen een probleem aan.
in de root staat de map app, de index.php en de Router.php.
In de map app staan de files home.php en post.php
index.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
include 'Router.php';
$request = $_SERVER['REQUEST_URI'];
$router = new Router($request);
$router->get('/', 'app/home');
$router->get('post', 'app/post');
?>
include 'Router.php';
$request = $_SERVER['REQUEST_URI'];
$router = new Router($request);
$router->get('/', 'app/home');
$router->get('post', 'app/post');
?>
Router.php
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
htacces
Code (php)
1
2
3
4
2
3
4
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]
Als ik www.example.com doe dan word de home.php inderdaad weergegeven.
Als ik www.example.com/post doe dan krijg ik een error "The requested URL /post/ was not found on this server."
Wie kan mij een zetje in de goede richting geven?
Ik heb mijn rewrite-rule zo staan:
Yoeri Achterbergen op 02/11/2020 20:40:11:
Als ik www.example.com/post doe dan krijg ik een error "The requested URL /post/ was not found on this server."
Waar komt deze melding uberhaupt vandaan? Is dit van je browser? Werkt je .htaccess bestand dan wel?
@thomas deze error komt van MAMP local server af.
En controleer dus even of het bestand de juiste extentie heeft (.htaccess met dubbel c en dubbel s).
Het wordt trouwens natuurlijk nog interessanter wanneer de URL een dynamisch deel heeft.
Stel je hebt bijvoorbeeld de pagina /fruit. En je wilt de code die deze URL verder afhandelt ook verantwoordelijk maken voor /fruit/apples, /fruit/oranges, et cetera. Hoe zorgt jouw router er dan voor dat die allemaal bij /fruit uitkomen? Daar wil je toch niet allemaal get() regels voor schrijven?
Gewijzigd op 03/11/2020 00:02:09 door Thomas van den Heuvel
@thomas
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
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
<?php
class Router{
private $request;
public function __construct($request){
$this->request = $request;
}
public function get($route, $file){
$uri = trim( $this->request, "/");
$uri = explode("/", $uri);
if($uri[0] == trim($route, "/")){
//hiermee zou ik de dynamische kant kunnen sturen Deze kan ik dan opvangen in de post.php of page.php met $args[0];
//deze kan ik dan weer gebruiken voor een query om de pagina te vullen met de info uit de database
array_shift($uri);
$args = $uri;
require $file . '.php';
}
}
}
?>
class Router{
private $request;
public function __construct($request){
$this->request = $request;
}
public function get($route, $file){
$uri = trim( $this->request, "/");
$uri = explode("/", $uri);
if($uri[0] == trim($route, "/")){
//hiermee zou ik de dynamische kant kunnen sturen Deze kan ik dan opvangen in de post.php of page.php met $args[0];
//deze kan ik dan weer gebruiken voor een query om de pagina te vullen met de info uit de database
array_shift($uri);
$args = $uri;
require $file . '.php';
}
}
}
?>
Yoeri Achterbergen op 03/11/2020 00:30:56:
Ik heb de MAMP gereset en het werkt :D
Fijn dat het werkt.
Ik ben benieuwd welke procedure je uitgevoerd hebt. Reset klinkt wel erg simpel.
Gewijzigd op 03/11/2020 00:34:10 door - Ariën -
Yoeri Achterbergen op 03/11/2020 00:30:56:
//hiermee zou ik de dynamische kant kunnen sturen Deze kan ik dan opvangen in de post.php of page.php met $args[0];
//deze kan ik dan weer gebruiken voor een query om de pagina te vullen met de info uit de database
//deze kan ik dan weer gebruiken voor een query om de pagina te vullen met de info uit de database
Ja, dat zou je inderdaad kunnen doen, maar dat heeft wel als bijeffect dat je alle URL's zult moeten opslaan in de database. Stel dat je een forum hebt, of een ander stuk functionaliteit met een heleboel "nodes" of "end points" dan is dat misschien een beetje onbegonnen werk, of op zijn minst nogal onpraktisch.
Goed punt! Op welke manier zou jij het aanpakken?