1. Zend Framework, obiekt Routera. W polskim manualu ZF jest nawet dobrze opisany mechanizm routingu we frameworku.
2. Przedstawiony tu sposob chyba nie jest najlepszy. A co kiedy URL wyglada jakos tak: strona.pl/?param=value¶m2=value2&...¶mN=valueN?
Lepiej zrobic rewrite tak aby doklejal request po index.php/, np:
Normalnie: strona.pl/param/value
Rewrite: strona.pl/index.php/param/value.
Wtedy string param/value trafia do $_SERVER['PATH_INFO'];
Przyklad obslugi takiego rozwiazania (klasa Router z mojego frameworka):
<?php
/**
* RewriteRouter is useful with mod_rewrite engine.
*
* URI should looks like:
* <a href="http://your.domain.here/action/Controller/parameter1/value1" target="_blank">http://your.domain.here/action/Controller/parameter1/value1</a>
*
*/
final class RewriteRouter extends AbstractRouter
{
public function __construct()
{
parent::__construct();
/**
* Sprawdzi, czy ustawiono mod_rewrite. Tylko wtedy PATH_INFO istanieje.
*/
if(empty($_SERVER['PATH_INFO'])) {
$sError = 'You have to set rewrite rule';
throw new RouterException($sError);
}
}
public function execute()
{
$sPathInfo = $_SERVER['PATH_INFO'];
/**
* Kilka zabiegow, koniecznych do sprawdzenia, czy podano jakies parametry.
*/
{
{
$aPath = explode('/', $sPathInfo); // rozbijamy nasz request na tablice. }
}
{
/**
* _parseRequest zlozy nam parametry do tablicy asocjacyjnej: param => value.
*/
$aParameters = $this->_parseRequest($aPath);
// A tu to juz kwestia zwiazana z frameworkiem.
if(!empty($aParameters[$this->_sActionAccessor
])) $sController = $aParameters[$this->_sActionAccessor];
else
$sController = $this->_sDefaultAction;
}
else
$sController = $this->_sDefaultAction;
$oToken = new DispatchToken($sController, $aParameters);
return $oToken;
}
private function _parseRequest
($aRequest = array()) {
for($i = 0; $i < count($aRequest); $i++) {
if($i % 2 == 0)
$aParmeters[] = $aRequest[$i];
else
$aValues[] = $aRequest[$i];
}
for($i = 0; $i < count($aParmeters); $i++) $aParsed[$aParmeters[$i]] = $aValues[$i];
return $aParsed;
}
}
?>
Adrian.