<< előző fejezet | következő fejezet >>
A router a megfelelő komponensek felé irányít a megadott beállítások függvényében, tehát szolgáltatást vagy tartalmat párosít az url-hez. Aki esetleg úgy gondolja, hogy az Apache mod_rewrite
modulja segítségével egy megfelelően összerakott .htaccess
fájlban is éppen ez zajlik, az jól gondolja.
A .htaccess
egyszerű és elegáns megoldás, de csak Apache webszervereken működik, ott is csak akkor, ha a mod_rewrite
modul engedélyezve van az etc/httpd.conf
konfigurációs állományban. Olyan megoldásra van tehát szükségünk, ami nem csak Apache alatt muzsikál és amennyire csak lehetséges, független a szerver beállításaitól. Erre találták ki az alkalmazásunk részét képező útválasztó (router) mechanizmust és többek közt ezért is irányítottunk az első leckében minden nem létező fájlokra és mappákra irányuló kérelmet az index.php névre hallgató front kontrollerünkre, ahelyett hogy ott helyben (a .htaccess
-ben) a $_GET tömb egyes elemeihez rendeltük volna az url részeit.
Jelenlegi beállításainkkal bármilyen url-el hívjuk meg az alkalmazásunkat, ugyan azt a választ fogjuk kapni. Ideje ezen változtatnunk. Bemutató alkalmazásunkban a FastRoute komponenst fogjuk használni, de ahogy a többi fejezetben, itt is lecserélhetjük ezt kedvenc csomagunkra, ha van ilyen. Néhány lehetséges alternatíva: symfony/Routing, Aura.Router, fuelphp/routing, Klein.
Telepítsük a kiválasztott routert a már ismert módon, majd írjuk a következő kódot a Bootstrap.php
fájlba, a Request
után, de még a Response
elé:
$dispatcher = \FastRoute\simpleDispatcher(function (\FastRoute\RouteCollector $r) {
$r->addRoute('GET', '/hello-world', function () {
echo 'Hello World';
});
$r->addRoute('GET', '/another-route', function () {
echo 'This works too';
});
});
$routeInfo = $dispatcher->dispatch($request->getMethod(), $request->getPath());
switch ($routeInfo[0]) {
case \FastRoute\Dispatcher::NOT_FOUND:
$response->setContent('404 - Page not found');
$response->setStatusCode(404);
break;
case \FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
$response->setContent('405 - Method not allowed');
$response->setStatusCode(405);
break;
case \FastRoute\Dispatcher::FOUND:
$handler = $routeInfo[1];
$vars = $routeInfo[2];
call_user_func($handler, $vars);
break;
}
A fenti kód első részében az alkalmazásunkban jelenleg elérhető útvonalakat regisztráltuk. Ez után meghívjuk a dispatcher-t ("menetirányító") majd a kapott kimenet függvényében végrehajtódik a switch kifejezés megfelelő része. Ha az útvonal létezik (3. eset), lefut a beállított kezelő-függvény, ha nem létezik (1. eset), vagy nem engedélyezett (2. eset) akkor a megfelelő hibaoldalra irányítjuk a felhasználót.
Ez a megoldás valóban kis alkalmazásoknál megfelelő lehet, de ha további útvonalakat adunk a bootstrap állományunkhoz, hamar áttekinthetetlenné válik. Ennek elkerülésére az útvonalainkat hasznos lehet egy külön fájlban tárolni. Hozzuk létre tehát a Routes.php
állományt az src/
mappában, az alábbi tartalommal:
<?php declare(strict_types = 1);
return [
['GET', '/hello-world', function () {
echo 'Hello World';
}],
['GET', '/another-route', function () {
echo 'This works too';
}],
];
Most írjuk át az útvonal dispatcher részét a Routes.php
alkalmazásához.
$routeDefinitionCallback = function (\FastRoute\RouteCollector $r) {
$routes = include('Routes.php');
foreach ($routes as $route) {
$r->addRoute($route[0], $route[1], $route[2]);
}
};
$dispatcher = \FastRoute\simpleDispatcher($routeDefinitionCallback);
Ez már egy fokkal jobb, de most az összes kezelő kódunk a Routes.php
-ban lakozik. Ez nem a legjobb megoldás, ezért a következő fejezetben majd javítani fogjuk.
Ne felejtsük el commitolni munkánkat minden egyes fejezet végén!