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

<?php
include 'Router.php';

$request = $_SERVER['REQUEST_URI'];
$router = new Router($request);

$router->get('/', 'app/home');
$router->get('post', 'app/post');


?>


Router.php

<?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

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?
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:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA]
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?
@arien, deze code heb ik geprobeerd maar krijg precies het zelfde.

@thomas deze error komt van MAMP local server af.
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[color=#ff0000]/apples[/color], /fruit[color=#ff0000]/oranges[/color], 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?
Ik heb de MAMP gereset en het werkt :D

@thomas


<?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.
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.
@thomas

Goed punt! Op welke manier zou jij het aanpakken?

Reageren