I wrote a little php url parser for my own php-mvc-framework and i need little help in the following code:
<?php
class Route{
private $routes = [];
public function __construct(){}
public function addRoute($method, $url, $callback){
$this->routes[] = array('method' => $method,
'url' => $url,
'callback' => $callback);
}
public function doRouting(){
$reqUrl = $_SERVER['REQUEST_URI'];
$reqMet = $_SERVER['REQUEST_METHOD'];
foreach($this->routes as $route) {
// convert urls like '/users/:uid/posts/:pid' to regular expression
$pattern = "@^" . preg_replace('/\\\:[a-zA-Z0-9\_\-]+/', '([a-zA-Z0-9\-\_]+)', preg_quote($route['url'])) . "$@D";
$matches = array();
if($reqMet == $route['method'] && preg_match($pattern, $reqUrl, $matches)) {
// remove the first match
array_shift($matches);
// call the callback with the matched positions as params
return call_user_func_array($route['callback'], $matches);
}
}
}
$route = new Route();
$route->addRoute('GET', '/', function(){
echo 'root';
});
$route->addRoute('GET', '/users/', function(){
echo 'users';
});
$route->addRoute('GET', '/users/:uid/posts/:pid/', function($uid, $pid){
echo $uid.'<br/>'.$pid;
});
$route->addRoute('GET', '/users/:uid/posts/:pid/edit', function($uid, $pid){
echo 'users posts edit';
});
$route->doRouting();
I want allow an optional /
at the end of the URL. For example, in this current routes definition when REQUEST_URI
is /users/123/posts/456
i want same result(function call) when REQUEST_URI
is /users/123/posts/456/
.
Also, /users/123/posts/456/edit
call new function.
Strip trailing slashes from your route if needed:
$route['url'] = rtrim($route['url'], '/');
And then terminate your route's pattern accordingly:
$pattern = preg_replace('/\\\:[a-zA-Z0-9\_\-]+/', '([a-zA-Z0-9\-\_]+)', preg_quote($route['url'], '@'));
$pattern = "@^$pattern/?$@D";
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With