PHP Web サービスのルーティングを処理するクラスを作成していますが、正規表現を修正する必要があり、URL を解析する最も効率的な方法を知りたいです。
URL の例:
- ポスト/ユーザー
- GET /ユーザー
- GET /ユーザー&制限=10&オフセット=0
- GET /users/search&keyword=リチャード
- GET /users/15/posts/38
クラス用にPHPで作成したいのはこれです:
$router = new Router();
$router->addRoute('POST', '/users', function(){});
$router->addRoute('GET', '/users/:uid/posts/:pid', function($uid, $pid){});
$target = $router->doRouting();
ターゲット変数には、次の配列が含まれます。
- 方法
- URL
- コールバック メソッド
これは私がこれまでに得たものです:
class Router{
use Singleton;
private $routes = [];
private $routeCount = 0;
public function addRoute($method, $url, $callback){
$this->routes[] = ['method' => $method, 'url' => $url, 'callback' => $callback];
$this->routeCount++;
}
public function doRouting(){
$reqUrl = $_SERVER['REQUEST_URI'];
$reqMet = $_SERVER['REQUEST_METHOD'];
for($i = 0; $i < $this->routeCount; $i++){
// Check if the url matches ...
// Parse the arguments of the url ...
}
}
}
したがって、まず最初に次の正規表現が必要です。
- /mainAction/:引数名/secondaryAction/:secondaryActionName
それが $reqUrl と一致するかどうかを確認します (上記の for ループを参照)
- 引数を抽出して、コールバック関数で使用できるようにします。
私が自分で試したこと:
(code should be in the for loop @ doRouting function)
// Extract arguments ...
$this->routing[$i]['url'] = str_replace(':arg', '.+', $this->routing[$i]['url']);
// Does the url matches the routing url?
if(preg_match('#^' . $this->routes[$i]['url'] . '$#', $reqUrl)){
return $this->routes[$i];
}
すべての助けに本当に感謝しています、どうもありがとう。