Simpele PHP router

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Yoeri Achterbergen

Yoeri Achterbergen

02/11/2020 20:40:11
Quote Anchor link
Hallo,


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)
PHP script in nieuw venster Selecteer het PHP script
1
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');


?>


Router.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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, "/")){
        
            require $file . '.php';
            
        }
    }
}

?>


htacces
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
RewriteEngine on
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?
 
PHP hulp

PHP hulp

18/01/2021 14:11:06
 
- Ariën -
Beheerder

- Ariën -

02/11/2020 20:49:54
Quote Anchor link
In ieder geval wordt de index.php niet aangeroepen in alle gevallen (bestaande bestanden/directories uitgesloten), dus ligt het probleem in de rewrite-rule.

Ik heb mijn rewrite-rule zo staan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA]
 
Thomas van den Heuvel

Thomas van den Heuvel

02/11/2020 23:06:35
Quote Anchor link
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?
 
Yoeri Achterbergen

Yoeri Achterbergen

02/11/2020 23:38:50
Quote Anchor link
@arien, deze code heb ik geprobeerd maar krijg precies het zelfde.

@thomas deze error komt van MAMP local server af.
 
Thomas van den Heuvel

Thomas van den Heuvel

03/11/2020 00:00:37
Quote Anchor link
Zet anders eens een rewriterule in je .htaccess die alles naar pietjepuk.htm stuurt, zodat je weet dat de rewriterules worden opgepikt.

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
 
Yoeri Achterbergen

Yoeri Achterbergen

03/11/2020 00:30:56
Quote Anchor link
Ik heb de MAMP gereset en het werkt :D

@thomas

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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';
            
        }
    }
}

?>
 
- Ariën -
Beheerder

- Ariën -

03/11/2020 00:33:50
Quote Anchor link
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 -
 
Thomas van den Heuvel

Thomas van den Heuvel

03/11/2020 01:50:32
Quote Anchor link
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

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.
 
Yoeri Achterbergen

Yoeri Achterbergen

03/11/2020 08:30:09
Quote Anchor link
@thomas

Goed punt! Op welke manier zou jij het aanpakken?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.