Nedávno jsem dělal JSON API pro možnost stahování článků z jednoho portálu postaveného na WordPressu, zároveň jsem ale chtěl aby URL měly správný tvar podle REST architektury. Toho bych se základními možnostmi WordPressu docílil těžko. Proto jsem se rozhodl využít vlastní router a skripty. Zde přišel čas na AltoRouter.
Opravdu jen router
Celý projekt je na GitHubu a zdrojový kód se skládá pouze z jediného souboru, nic víc než routování nenabídne. Jestli chcete pro každou routu mít jednu funkci, nebo spustit skript, nebo mít kontrolery je pouze na vás. Zde je malá ukázka všech 3 možností.
$router = new AltoRouter(); $router->setBasePath("/path/to/api"); $router->map('GET', '/section/[i:id]/', function ($id) { echo "Výpis sekce s ID {$id}"; } ); $router->map('GET', '/section/[i:sid]/article/[i:aid]/', array( "Controller" => "Article", "Action" => "Detail" ), "ArticleFromSection"); $router->map('GET', '/user/', "userList"); $match = $router->match(); if($match){ if (is_callable($match['target'])) { // Target je funkce, stačí zavolat call_user_func_array($match['target'], $match['params']); }else if (is_string($match['target']) && file_exists($match['target'].".php")) { // Je název souboru, vložíme include $match['target'].".php"; }else if (is_array($match['target']) && isset($match['target']['Controller']) && isset($match['target']['Action']) ) { // Načtení třídy ponechám na vás, jestli používáte autoloader nebo si provedete include souboru $className = $match['target']['Controller']."Controller"; $cls = new $className(); call_user_func_array(array($cls, $match['target']['Action']), $match['params']); }else{ echo "Akci nelze provést"; } } else { echo "Žádná shoda"; }
Všimněte si, že u jedné routy mám také definován její název, konkrétně ArticleFromSection. Díky názvu si můžeme zpět nechat vygenerovat URL.
// Vypíše /path/to/api/section/123/article/890/ echo $router->generate("ArticleFromSection", array( "sid" => 123, "aid" => 890 ));
AltoRouter má již připravené také předpřipravené datové typy, které lze využít v placeholdrech v URL jako já použil i v URL /[i:id]/ apod. Celý jejich výpis naleznete v dokumentaci, ale samozřejmě je možné si přidat i své.
Pokud se rozhodnete AltoRouter používat, určitě se podívejte na dokumentaci blíže. Pro úvod a nastínění myslím dostatečně stačí. Pokud AltoRouter nebo jiný používáte, podělte se s námi v komentářích.
K tomuto článku již není možné přidávat další komentáře