Router

Kvůli dlouhému obsahu jsem stránku Další možnosti rozdělila na samostatné části:


Pěkné URL a skládání z více skriptů

Běžná praxe u menších webů: používá se .htaccess pro pěkné URL, stránka je skládaná z kousků. Podle parametru z URL se includuje skript pro obsahovou část, hlavička a patička jsou společné, (viz třeba příklad na DJPW).

Předpokládejme, že máme takovouhle strukturu adresářů:

includes
    + chyba.php
    + dalsi-stranka.php
    + hlavicka.php
    + paticka.php
    + uvod.php
    
libs 
    + Route.php
    + Router.php
    + RouterForIncludes.php
    + SimpleRoute.php
    
index.php
.htaccess

Soubor index pak může vypadat takto:

require 'libs/Route.php';
require 'libs/SimpleRoute.php'; // pokud ji používáte, viz část "Adresy složené z parametrů"
require 'libs/Router.php';
require 'libs/RouterForIncludes.php';

// výchozí stránka/skript
$defaultPage = array('page' => 'uvod');
$router = new RouterForIncludes($defaultPage);

$router->addRoute('/:page<[a-z0-9_-]+>', array('page' => 'uvod'), Route::CI);

$cesta = dirname(__FILE__).'/includes';

$router->setCallbackMask("$cesta/hlavicka.php, $cesta/<page>.php, $cesta/paticka.php");
$router->setErrorCallback("$cesta/hlavicka.php, $cesta/chyba.php, $cesta/paticka.php");

$router->parseUrl($_GET['route']);

try {
    $router->delegate();
} catch (Exception $e)    {
    echo 'Chyba nastavení: některý z požadovaných souborů neexistuje a/nebo není definovaný errorCallback.';
    echo '<br>Chybová zpráva: ' . $e->getMessage();
}

NB: Pokud kterýkoli z požadovaných souborů neexistuje, router vyhodí výjimku.

Omezený kontext

Soubory se includují uvnitř funkce, tedy v uzavřeném kontextu. Kromě superglobálních polí ($_POST, $_GET apod.) mají k dispozici ještě proměnnou $router, odkazující na aktuální instanci routeru. Pokud chcete skriptům umožnit přístup ke globálním proměnným, anebo předávat data mezi skripty, využijete metodu addToContext():

Nastavení routeru (index.php)
// hodnota proměnné $x bude v incl. souborech přístupná jako proměnná $var
$x = 'Ahoj světe';
$router->addToContext('var', $x);

$router->setCallbackMask('prvniSkript.php, druhySkript.php');
$router->delegate();
prvniSkript.php
echo 'Prvni skript. Globalni promenna $x tu je: ', $var, "\n";

// všechny následující skripty dostanou proměnnou $foo s hodnotou "bar"
$router->addToContext('foo', 'bar');
druhySkript.php
echo 'Druhy skript. Globalni promenna $x tu je: ', $var;
echo ' a promenna $foo taky: ', $foo;
Výsledek
Prvni skript. Globalni promenna $x tu je: Ahoj světe
Druhy skript. Globalni promenna $x tu je: Ahoj světe a promenna $foo taky: bar

Metodu addToContext je možné volat i pouze s jedním parametrem - v tom případě očekává asociativní pole. Takže jestli už máte připravená nějaká data jako pole, nemusíte je do kontextu složitě přidávat po jednom prvku.

Poslední aktualizace: 24. 6. 2012 15:54