AltoRouter - Jednoduchý PHP router

Pavel Tipy & triky, PHP

Představení jednoho z mnoha routerů pro PHP se základními schopnostmi routování podle HTTP metod, dynamického routování ale také reverzní generování URL podle předaných parametrů.

AltoRouter - Jednoduchý PHP router

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.

Přidat komentář

Právě odpovídáte na existující komentář. Zrušit

Komentáře

Novinky z blogu

Do Hyundai na interní prohlídku

Jak jsme zavítali do fabriky Hyundai Dymos v Nošovicích na jednu interní exkurzi. Absolvovali bezpečnostním školením, prošli si výrobní halu a také mohli zkusit vyrobit...

Další články